洛谷 P2633 Count on a tree 题解
对于每个点建立一颗主席树;
然后按照树上差分的思想统计主席树的前缀和;
lca+主席树+前向星存表就可以了;
#include <bits/stdc++.h>
#define inc(i,a,b) for(register int i=a;i<=b;i++)
#define dec(i,a,b) for(register int i=a;i>=b;i--)
using namespace std;
int head[2000010],cnt;
class littlestar{
public:
int to;
int nxt; }star[2000010];
void add(int u,int v){
star[++cnt].to=v;
star[cnt].nxt=head[u];
head[u]=cnt;
}
int n,m;
template<class nT>
inline void read(nT& x)
{
char c;
while(c=getchar(),!isdigit(c));
x=c^48;
while(c=getchar(),isdigit(c)) x=x*10+c-48;
}
int a[2000010],val[2000010];
int dep[2000010],f[1000010][30];
void pre(int u,int fa)
{
//printf("%d %d\n",u,fa);
dep[u]=dep[fa]+1;
inc(i,0,20){
f[u][i+1]=f[f[u][i]][i];
}
for(register int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==fa) continue;
f[v][0]=u;
pre(v,u);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
dec(i,19,0){
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(x==y) return x;
}
dec(i,19,0){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int rt[20000010];
int num=0;
class node2{
public:
int l;
int r;
int w;
}tree[20000010];
void insert(int preroot,int &root,int l,int r,int goal){
tree[root=++num]=tree[preroot];
tree[root].w++;
if(l==r) return;
int mid=(l+r)>>1;
if(goal<=mid){
insert(tree[preroot].l,tree[root].l,l,mid,goal);
}
else{
insert(tree[preroot].r,tree[root].r,mid+1,r,goal);
}
tree[root].w=(tree[tree[root].l].w+tree[tree[root].r].w);
}
int query(int l,int r,int x,int y,int lc,int falc,int k){
if(l==r) return l;
int tmp=tree[tree[x].l].w+tree[tree[y].l].w-tree[tree[lc].l].w-tree[tree[falc].l].w;
int mid=(l+r)>>1;
if(k<=tmp){
return query(l,mid,tree[x].l,tree[y].l,tree[lc].l,tree[falc].l,k);
}
else{
return query(mid+1,r,tree[x].r,tree[y].r,tree[lc].r,tree[falc].r,k-tmp);
}
}
void dfs(int u)
{
insert(rt[f[u][0]],rt[u],1,n,val[u]);
for(register int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==f[u][0]) continue;
dfs(v);
}
}
int ago[2000010];
signed main()
{
//freopen("ha.in","r",stdin);
read(n); read(m);
inc(i,1,n) read(a[i]),val[i]=a[i];
inc(i,1,n-1){
int u,v;
read(u); read(v);
add(u,v);
add(v,u);
}
sort(a+1,a+1+n);
int lisan=unique(a+1,a+1+n)-a-1;
inc(i,1,n){
int tmp=val[i];
val[i]=lower_bound(a+1,a+1+lisan,val[i])-a;
ago[val[i]]=tmp;
}
pre(1,0);
dfs(1);
int onlineans=0;
inc(i,1,m){
int u,v,k;
read(u);read(v);read(k);
u^=onlineans;
int LCA=lca(u,v);
int last=query(1,n,rt[u],rt[v],rt[LCA],rt[f[LCA][0]],k);
onlineans=ago[last];
printf("%d\n",onlineans);
}
}
洛谷 P2633 Count on a tree 题解的更多相关文章
- 洛谷 P2633 Count on a tree
P2633 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中last ...
- 洛谷P2633 Count on a tree(主席树上树)
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- 洛谷P2633 Count on a tree
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- 洛谷 P2633 Count on a tree 主席树
在一棵树上,我们要求点 $(u,v)$ 之间路径的第$k$大数. 对于点 $i$ ,建立 $i$ 到根节点的一棵前缀主席树. 简单容斥后不难得出结果为$sumv[u]+sumv[v]−sumv[l ...
- ☆ [洛谷P2633] Count on a tree 「树上主席树」
题目类型:主席树+\(LCA\) 传送门:>Here< 题意:给出一棵树.每个节点有点权.问某一条路径上排名第\(K\)小的点权是多少 解题思路 类似区间第\(K\)小,但放在了树上. 考 ...
- 洛谷P2633 Count on a tree 主席树
传送门:主席树 解题报告: 传送门! umm这题我还麻油开始做 所以 先瞎扯一波我的想法,如果错了我就当反面教材解释这种典型错误,对了我就不管了QwQ 就直接dfs,在dfs的过程中建树 然后就直接查 ...
- 洛谷 P6177 - Count on a tree II/【模板】树分块(树分块)
洛谷题面传送门 好家伙,在做这道题之前我甚至不知道有个东西叫树分块 树分块,说白了就是像对序列分块一样设一个阈值 \(B\),然后在树上随机撒 \(\dfrac{n}{B}\) 个关键点,满足任意一个 ...
随机推荐
- Codeforces 981 D.Bookshelves(数位DP)
Codeforces 981 D.Bookshelves 题目大意: 给n个数,将这n个数分为k段,(n,k<=50)分别对每一段求和,再将每个求和的结果做与运算(&).求最终结果的最大 ...
- Location of Docker images in all Operating Systems (Linux, Windows, Redhat, Mac OS X)
原文:http://www.scmgalaxy.com/tutorials/location-of-dockers-images-in-all-operating-systems/ Location ...
- redis如何清空当前缓存和所有缓存
Windows环境下使用命令行进行redis缓存清理1.redis安装目录下输入cmd2.redis-cli -p 端口号3.flushdb 清除当前数据库缓存4.flushall 清除 ...
- 让SpringBoot工程支持热部署
下载地址:https://files.cnblogs.com/files/xiandedanteng/SpringBootWeb-1_20190928.rar 修改Java文件后,每次要重启才好用,修 ...
- DP&图论 DAY 5 上午
DP&图论 DAY 5 上午 POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...
- git远程删除分支后,本地执行git branch -a依然能看到删除分支到底该咋整?
使用命令git branch -a可以查看所有本地分支和远程分支(git branch -r 可以只查看远程分支) 如果发现很多在远程仓库已经删除的分支在本地依然可以看到到底该怎么办呢?(反正强迫症受 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_2_02 微服务核心基础讲解
笔记 2.微服务核心基础讲解 简介:讲解微服务核心知识 :网关.服务发现注册.配置中心.链路追踪.负载均衡器.熔断 1.网关:路由转发 + 过滤器 ...
- Kubernetes中的PV和PVC
K8S引入了一组叫作Persistent Volume Claim(PVC)和Persistent Volume(PV)的API对象,大大降低了用户声明和使用持久化Volume的门槛.在Pod的Vol ...
- spark热门电影
package movies import org.apache.spark.rdd.RDDimport org.apache.spark.{SparkConf, SparkContext} obje ...
- Matlab中的eig函数和Opecv中eigen()函数的区别
奇异值分解的理论参见下面的链接 http://www.cnblogs.com/pinard/p/6251584.html https://blog.csdn.net/shenziheng1/artic ...