题面

对于每个点建立一颗主席树;

然后按照树上差分的思想统计主席树的前缀和;

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 题解的更多相关文章

  1. 洛谷 P2633 Count on a tree

    P2633 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中last ...

  2. 洛谷P2633 Count on a tree(主席树上树)

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...

  3. 洛谷P2633 Count on a tree(主席树,倍增LCA)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  4. 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  5. 洛谷P2633 Count on a tree

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...

  6. 洛谷 P2633 Count on a tree 主席树

    在一棵树上,我们要求点 $(u,v)$ 之间路径的第$k$大数. 对于点 $i$  ,建立 $i$  到根节点的一棵前缀主席树. 简单容斥后不难得出结果为$sumv[u]+sumv[v]−sumv[l ...

  7. ☆ [洛谷P2633] Count on a tree 「树上主席树」

    题目类型:主席树+\(LCA\) 传送门:>Here< 题意:给出一棵树.每个节点有点权.问某一条路径上排名第\(K\)小的点权是多少 解题思路 类似区间第\(K\)小,但放在了树上. 考 ...

  8. 洛谷P2633 Count on a tree 主席树

    传送门:主席树 解题报告: 传送门! umm这题我还麻油开始做 所以 先瞎扯一波我的想法,如果错了我就当反面教材解释这种典型错误,对了我就不管了QwQ 就直接dfs,在dfs的过程中建树 然后就直接查 ...

  9. 洛谷 P6177 - Count on a tree II/【模板】树分块(树分块)

    洛谷题面传送门 好家伙,在做这道题之前我甚至不知道有个东西叫树分块 树分块,说白了就是像对序列分块一样设一个阈值 \(B\),然后在树上随机撒 \(\dfrac{n}{B}\) 个关键点,满足任意一个 ...

随机推荐

  1. Linux之防火墙iptables

    一.检查iptables服务状态 1.首先检查iptables服务的状态 [root@bogon ~]# service iptables status iptables: Firewall is n ...

  2. Windows环境下Zookeeper的安装和部署(单机模式和伪集群模式)

    第一部分:单机模式 1)下载地址:http://www.pirbot.com/mirrors/apache/zookeeper/,建议下载stable版本 2)解压缩 将下载好的压缩包解压到指定目录, ...

  3. 微信小程序设置全局变量

    为了提高程序的可用性我们在做项目的时候一定要设置全局变量 微信小程序里面有个app.js,我们可以在这个里面设置全局变量, globalData:{ userInfo:null, test:" ...

  4. js第一次学习心得

    最近开始接触js,用的是阮一峰的菜鸟教程,相对来说我觉得是比较通俗易懂的,用了很多很小的例子去讲每一个很小的细节,但对于我这种因为即将到来的团队作业做准备的,也没有办法将每个细节都理解的清楚,主要的把 ...

  5. web前端知识点反思总结

    当别人问你之前的知识,我们便会勾起之前的回忆,然后进行一番痛苦的挣扎后,发现我依然记得你 什么是 DTD ? 文档类型定义 (DTD) 可定义合法的 xml 文档的构建模块 ,他是使用一系列合法的元素 ...

  6. 再谈用Excel计算年龄

    有的时候,对于客人的信息并不是全知,那么身份证就可能用15位来代替,这个时候怎么计算年龄呢?有一个很简单的公式,可以一次性计算15位或18位身份证的年龄. 首先,需要判断一下,这个身份证是15位还是1 ...

  7. ubuntu下tomcat运行不起来解决

    报错Neither the JAVA_HOME nor the JRE_HOME environment variable is definedAt least one of these enviro ...

  8. 【VBA】多条件去重

    Function kaidan(txt)Dim i As IntegerDim arrSet d = CreateObject("scripting.dictionary")For ...

  9. mysql解决删除数据后,主键不连续问题

    题记:强迫症需求,一个小技巧. 亲测有效 SET @i=; UPDATE table_name SET `); ALTER TABLE table_name AUTO_INCREMENT=; 注意:主 ...

  10. 使用MyBatis的动态SQL表达式时遇到的“坑”(integer)

    现有一项目,ORM框架使用的MyBatis,在进行列表查询时,选择一状态(值为0)通过动态SQL拼接其中条件但无法返回正常的查询结果,随后进行排查. POJO private Integer stat ...