P2633 Count on a tree

P2633 Count on a tree

题意:

给定一棵 n 个节点的树,每个点有一个权值。有 m 个询问,每次给你 u,v,k,你需要回答 u xor last 和 v 这两个节点间第 k 小的点权。

其中last 是上一个询问的答案,定义其初始为 0,即第一个询问的 u 是明文。

题解:

很明显,主席树,而且强制在线(更是主席树)
主席树是维护了一个类似前缀和的数据结构,当要查询线性区间[l,r]的第k小时,用第r个线段树减第l-1个线段树,得到的就是[l,r]之间的权值线段树(因为主席树维护的就是前缀和),然后直接用二分查找第k小就行
在本题中给了一个树,问点u到点v之间的第k小,我们都知道树上差分(应该都知道),我们利用树上差分就可以得到u到v之间的数据
定义s[u]为从根节点到点u节点的主席树,那么u到v之间的所有数值信息的主席树就应该是:
s[u]+s[v]-s[lca[u,v]]-s[fa[lca(u,v)]]
因为需要lca所以要用到倍增,可以在dfs中插入每个点

代码:


#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define M 2000010
int read(){int ans=0,w=1;char c=getchar();while(c!='-'&&!isdigit(c))c=getchar();if(c=='-')w=-1,c=getchar();while(isdigit(c))ans=ans*10+c-'0',c=getchar();return ans*w;
}
int n,m,num,lastans=0,u,v,tot,cnt;
struct Edge{int v,next;}E[N<<1];
int head[N],a[N],b[N],fa[N][32],dep[N];
int rt[M]={0},ls[M]={0},rs[M]={0},siz[M]={0};
void add(int u,int v){E[++tot]=(Edge){v,head[u]};head[u]=tot;
}
void modify(int &rt,int lastrt,int l,int r,int val){rt=++cnt;ls[rt]=ls[lastrt]; rs[rt]=rs[lastrt];siz[rt]=siz[lastrt]+1;if(l==r)return;int mid=l+r>>1;if(mid>=val)modify(ls[rt],ls[lastrt],l,mid,val);else modify(rs[rt],rs[lastrt],mid+1,r,val);
}
int query(int rt1,int rt2,int rt3,int rt4,int l,int r,int k){if(l==r)return l;int mid=(l+r)>>1;int tmp=siz[ls[rt1]]+siz[ls[rt2]]-siz[ls[rt3]]-siz[ls[rt4]];if(tmp>=k)return query(ls[rt1],ls[rt2],ls[rt3],ls[rt4],l,mid,k);else return query(rs[rt1],rs[rt2],rs[rt3],rs[rt4],mid+1,r,k-tmp);
}
void dfs(int u,int f){dep[u]=dep[f]+1;for(int i=head[u];i;i=E[i].next){int v=E[i].v;if(v==fa[u][0])continue;fa[v][0]=u;modify(rt[v],rt[u],1,num,a[v]);dfs(v,u);}
}
int Lca(int x,int y){if(dep[x]<dep[y])swap(x,y);int t=dep[x]-dep[y];for(int i=0;(1<<i)<=t;i++)if((1<<i)&t)x=fa[x][i];for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];if(x==y)return x;return fa[x][0];
}
int main(){n=read();m=read();for(int i=1;i<=n;i++)b[i]=a[i]=read();sort(b+1,b+n+1);num=unique(b+1,b+n+1)-b;for(int i=1;i<n;i++){u=read();v=read();add(u,v);add(v,u);}for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+num+1,a[i])-b;modify(rt[1],rt[0],1,num,a[1]);dfs(1,0);int up=log2(n);for(int k=1;k<=up;k++)for(int i=1;i<=n;i++)fa[i][k]=fa[fa[i][k-1]][k-1];for(int i=1;i<=m;i++){u=read();v=read();int k=read();u^=lastans;int lca=Lca(u,v);int ans=b[query(rt[u],rt[v],rt[lca],rt[fa[lca][0]],1,num,k)];printf("%d\n",ans);lastans=ans;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NewLife.XCode]增量累加

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

King of Range

King of Range 题意&#xff1a; 给你n个数&#xff0c;有m个询问&#xff0c;每次询问一个x&#xff0c;问有多少个区间的最大值减最小值大于x 题解&#xff1a; 我一开始的想法 st表实现区间最大减最小&#xff0c;利用二分来找这个区间范围&#xff0c;复杂度O(nmlogn)&…

膜拜大丹(结论+二元环)

problem 有两个国家&#xff0c;国家 AAA 有 nnn 座城市&#xff0c;国家 BBB 有 mmm 座城市&#xff0c;两个国家间有若干条单向航线。 具体地&#xff0c;有长度为 nnn 的数组 aaa 和长度为 mmm 的数组 bbb。国家 AAA 的第 iii 座城市有单向航线可以到达国家 BBB 的 1∼ai1…

Jewels

Jewels 题意&#xff1a; 你的坐标是(0,0,0)&#xff0c;有m个宝物&#xff0c;分别坐标是是(xi,yi,zi),它的z坐标以每秒下沉vi深度&#xff0c;你每次获取一个宝物的费用是两者的距离的平方&#xff0c;每秒只能获取一个宝物&#xff0c;从第0秒开始&#xff0c;问获取所有宝…

[NewLife.XCode]脏数据

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[学习笔记] 二分图基础定理的相关证明

最小点集覆盖最大匹配 最小点集覆盖&#xff1a;选出最少的点使得每条边都至少有一个端点被选。 先证最小点集覆盖 ≥\ge≥ 最大匹配 假设最大匹配为 xxx&#xff0c;即有 xxx 条边两两之间没有公用点。 光覆盖这些边就要用到 xxx 个点。 “不少于”已证。 再证最小点集覆盖 …

Boxes

Boxes 题意&#xff1a; 有n个盒子&#xff0c;每个盒子里要么是黑球&#xff0c;要么是白球&#xff0c;你可以花C的代码得知剩下所有盒子中黑球数量和白球数量&#xff0c;(只是知道总数量&#xff0c;并不知道具体哪个盒子里是什么)&#xff0c;你可以可以花费wi的代价开第…

Double Strings

Double Strings 题意&#xff1a; 给你s和t两个字符串&#xff0c;在其中选出两个等长的子序列(可以不连续)a&#xff0c;b&#xff0c;满足a的字典序严格小于b的字典序&#xff0c;问方案数,答案mod(1e97) 题解&#xff1a; 好的方案的构成是一段相同的前缀一个不同的字符…

你真的了解用户吗?-浅谈《用户画像》的意义和方法

作者&#xff1a;陈炯关于作者系统集成项目管理高级工程师某大型国有银行高级质量管理师从事IT项目管理工作十余年具有丰富的开发与管理经验公司内部敏捷转型的发起者之一深度参与敏捷实践与总结大学校园里流传最广的一句话是什么&#xff1f;“防火防狼防师兄”。为什么师兄这…

[学习笔记] 二次剩余

二次剩余 对于素数 ppp 和数 aaa&#xff0c;满足 (a,p)1(a,p)1(a,p)1。&#xff08;注意 aaa 不一定小于 ppp&#xff09; 若 ∃xx2≡a(modp)\exist_{x}\ x^2\equiv a\pmod p∃x​ x2≡a(modp)&#xff0c;则称 aaa 是模 ppp 意义下的二次剩余&#xff0c;xxx 称为该二次剩余…

Script Lab 续:为 Officejs 开发配置 VSCode 环境

垫场AA&#xff1a;深度&#xff1a;从 Office 365 新图标来看微软背后的设计新理念--------------------------------------------------前期01&#xff1a;尝试&#xff1a;Script Lab&#xff0c;快速 Office 365 开发工具前期02&#xff1a;尝试&#xff1a;Script Lab&…

P3567 [POI2014]KUR-Couriers

P3567 [POI2014]KUR-Couriers 题意&#xff1a; 给一个长度为 n 的正整数序列 a。共有 m 组询问&#xff0c;每次询问一个区间 [l,r] &#xff0c;是否存在一个数在 [l,r]中出现的次数严格大于一半。如果存在&#xff0c;输出这个数&#xff0c;否则输出 0。 题解&#xff1…

[WC 2022 Day3 zmy] Od deski do deski(dp)

设 fi:1∼if_{i}:1\sim ifi​:1∼i 能否分成若干个首尾相同的区间 则有 fiORj<i(fj−1∧ajai)f_{i}\text{OR}_{j<i}(f_{j-1}\wedge a_ja_i)fi​ORj<i​(fj−1​∧aj​ai​)。 这是最原始的暴力 dpdpdp&#xff0c;时间 O(n2m)O(n^2m)O(n2m)。 事实上&#xff0c;这…

编程方式重启 ASP.NET Core 网站

点击上方蓝字关注“汪宇杰博客”常言道&#xff0c;多喝热水&#xff0c;重启试试。有时候当应用工作不正常&#xff0c;重启也许能解决问题。但是程序员通常接触不到服务器系统权限。而运维人员和公司流程经常人为制造麻烦阻止我们去重启应用。老实的程序员不善言辞交际&#…

可持久化3--可持久化01Trie

01Trie 可持久化 01Trie 的方式和可持久化值域线段树的方式是相似的&#xff0c;只是以 01字典树 的方式来维护值域。一般用来解决异或相关的能够按位贪心的题目。 其实就是将可持久化线段树中的操作嫁接到01Trie中&#xff0c;这样就是解决任意一个区间内的问题。 例题&…

AGC044E Pandom Pawn(期望+凸包)

最开始我们先旋转一下这张桌子&#xff0c;使得 A1An1max⁡{Ai}A_1A_{n1}\max\{A_i\}A1​An1​max{Ai​}。 这是非常有效的&#xff0c;因为我们把环就变成链&#xff0c;只要到达了链的任意一端 1/n11/n11/n1 就肯定会结束游戏。 定义 Ei:E_i:Ei​: 从 iii 开始游戏&#xf…

.NET Core 容器化调查

前几天在微信朋友圈做了一个简单的调查&#xff0c;参与人数有500人&#xff0c;调查结果如下&#xff1a;使用K8S的比例非常类似于2017年初我在公众号里针对.NET Core的使用情况的比例。.NET Core是针对云原生应用开发而重新设计的一个平台&#xff0c;.NET Core借鉴了.NET Fr…

P4735 最大异或和

P4735 最大异或和 题意&#xff1a; 一个非负序列a&#xff0c;初始长度为n&#xff0c;有两种操作&#xff1a; A x&#xff0c;在序列中添加x&#xff0c;n加一Q l r x,询问操作&#xff0c;询问一个位置p&#xff0c;p满足l<p<r,使得p到位置n的的异或和与x的异或值…

[学习笔记] 单位根反演

单位根反演 [k∣n]1k∑i0k−1ωkin[k\mid n]\frac 1k\sum_{i0}^{k-1}\omega_k^{in}[k∣n]k1​∑i0k−1​ωkin​ kkk 次单位根是 kkk 次幂为 111 的复数解 wkw_kwk​。利用单位圆和单位根的关系很容易证明。 k∣nk\mid nk∣n 显然 ωkin\omega_k^{in}ωkin​&#xff0c;相当于…

NET Core微服务之路:再谈分布式系统中一致性问题分析

前言一致性&#xff1a;很多时候表现在IT系统中&#xff0c;通常在分布式系统中&#xff0c;必须&#xff08;或最终&#xff09;为多个节点的数据保持一致。世间万物&#xff0c;也有存在相同的特征或相似&#xff0c;比如儿时的双胞胎&#xff0c;一批工厂流水线的产品&#…