在每一个点的父亲做主席树,每次访问时用两个点的和减去其LCA和LCA父亲的和即可。

#include<bits/stdc++.h>
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int q[101000],a[101000],fa[101000],n,m,len=0,dd,lin[101000],cnt=0,p[100100][23],hash[101000],l[2500000],r[2500000],sum[2500000],d[101000],root[101000];
bool f[101000];
struct one
{int y,next;
};
one e[201000];
void insert(int xx,int yy)
{e[++len].next=lin[xx];lin[xx]=len;e[len].y=yy;
}
int maketree(int L,int R)
{int rt=++len;sum[rt]=0;if(L<R){int mid=(L+R)>>1;l[rt]=maketree(L,mid);r[rt]=maketree(mid+1,R);}return rt;
}
int lca(int x,int y)
{if(d[x]>d[y])swap(x,y);int ff=d[y]-d[x];for(int i=0;(1<<i)<=n;i++){if((1<<i)&ff)y=p[y][i];}if(x==y)return x;for(int i=log2(n);i>=0;i--)if(p[x][i]!=p[y][i]){x=p[x][i];y=p[y][i];}x=p[x][0];return x;
}
int update(int pre,int L,int R,int x)
{int rt=++len;sum[rt]=sum[pre]+1;l[rt]=l[pre];r[rt]=r[pre];if(L<R){int mid=(L+R)>>1;if(x<=mid)l[rt]=update(l[pre],L,mid,x);else r[rt]=update(r[pre],mid+1,R,x);}return rt;
}
void init()
{q[1]=1;int head=0,tail=1;f[1]=true;while(head++<tail){int tn=q[head];int x=lower_bound(hash+1,hash+dd+1,a[tn])-hash;root[tn]=update(root[fa[tn]],1,dd,x);for(int i=lin[tn];i;i=e[i].next){if(f[e[i].y])continue;f[e[i].y]=true;fa[e[i].y]=tn;p[e[i].y][0]=tn;d[e[i].y]=d[tn]+1;q[++tail]=e[i].y;}}for(int i=1;i<=22;i++){for(int j=1;j<=n;j++){p[j][i]=p[p[j][i-1]][i-1];}}
}int query(int x,int y,int LCA,int faLCA,int L,int R,int k)
{int f1=sum[l[x]]-sum[l[faLCA]]+sum[l[y]]-sum[l[LCA]];if(L>=R)return L;int mid=(L+R)>>1;if(k<=f1)return query(l[x],l[y],l[LCA],l[faLCA],L,mid,k);else return query(r[x],r[y],r[LCA],r[faLCA],mid+1,R,k-f1);
}
int work(int x,int y,int k)
{int LCA=lca(x,y);return query(root[x],root[y],root[LCA],root[fa[LCA]],1,dd,k);
}
int main()
{//freopen("xf.in","r",stdin);//freopen("xf.out","w",stdout);n=read();m=read();int x,y,k;for(int i=1;i<=n;i++){scanf("%d",&a[i]);hash[i]=a[i];}for(int i=1;i<n;i++){x=read();y=read();insert(x,y);insert(y,x);}len=0;sort(hash+1,hash+n+1);dd=unique(hash+1,hash+n+1)-hash-1;root[0]=maketree(1,dd);init();int ans=0;for(int i=1;i<m;i++){x=read();x^=ans;y=read();k=read();ans=hash[work(x,y,k)];printf("%d\n",ans);}x=read();x^=ans;y=read();k=read();ans=hash[work(x,y,k)];printf("%d",ans);return 0;
}

  注意最后一行不换行。

转载于:https://www.cnblogs.com/mybing/p/8548867.html

bzoj2588: Spoj 10628. Count on a tree 主席树相关推荐

  1. SPOJ 10628 Count on a tree 主席树 附数据生成器

    很奇怪的题啊,感觉思路和别人一样,但是我得用快速IO才能AC--不然就T 没用快速output,只用了快速input 而且居然限制代码长度...代码要短于6000B,我改了好久啊 题目大意:给一棵树, ...

  2. bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)

    每个节点继承父节点的树,则答案为query(root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y)]]) #include<iostream> #i ...

  3. SPOJ COT Count on a tree 主席树

    题意: 给\(n(1 \leq n \leq 10^5)\)一棵树,每个点有个权值. 还有\(m(1 \leq m \leq 10^5)\)个询问: \(u \, v \, k\),查询路径\(u \ ...

  4. BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树

    2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...

  5. BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )

    Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...

  6. bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)

    Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MB Submit: 7669  Solved: 1894 [Sub ...

  7. BZOJ 2588 Spoj 10628 Count on a tree | 树上主席树

    BZOJ 2588 Count on a tree 题面 求树上两点之间路径上第k大的点权. 题解 一开始看到这道题觉得是树剖,然后又听说是主席树,然后以为是主席树+树剖,差点没吓死-- 然后发现,如 ...

  8. 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree...

    题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...

  9. 洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree

    [题解] 蜜汁强制在线... 每个点开一个从它到根的可持久化权值线段树.查询的时候利用差分的思想在树上左右横跳就好了. 1 #include<cstdio> 2 #include<a ...

最新文章

  1. CVPR 2020 论文大盘点-全景分割与视频目标分割篇
  2. 耗时三小时整理的机器视觉知识-建议收藏转发
  3. 如何再造一个百度贴吧兼谈如何改造园子的团队
  4. java 封装 继承和多态
  5. Javascript创建类的七种方法
  6. mysql权限清理_mysql清理用户权限
  7. Hibernate配置数据源,数据库连接池
  8. 开源免费的.NET图像即时处理的组件ImageProcessor
  9. CSDN,CNBLOGS博客文章一键转载插件 终于更新了!
  10. 大厂offer手到擒来,Java面试真题精选
  11. Tapestry 和 JSF
  12. spring boot 处理自定义注解
  13. iqc工作职责和工作内容_新媒体实习生是做什么的?新媒体实习生岗位职责工作内容...
  14. Shiro和Zuul权限管理整合方案
  15. Android Gradle配置资源前缀
  16. 多边形的扫描转换算法 c语言,C++程序例题:多边形扫描转换算法
  17. c语言循环丘比特之箭,《我的世界》用两条指令驾驭命令方块 发射爱心骑筋斗云无所不能...
  18. fabric-ca-client 详解动态添加组织
  19. 全网最详细最基础的网络安全入门教程
  20. java实现word文档转pdf,并添加水印

热门文章

  1. 蓝桥杯 ADV-21 算法提高 多项式输出
  2. [Java] 蓝桥杯ALGO-11 算法训练 瓷砖铺放
  3. [Java] 蓝桥杯BASIC-19 基础练习 完美的代价
  4. 安装oh-my-zsh后terminal/iterm命令行终端前面用户计算机名消失之如何出现
  5. 蓝桥杯 ADV-81 算法提高 数的运算
  6. PHP可以读取什么配置文件,PHP读取配置文件类实例
  7. linux中shell curl命令获取http状态码--------强大的网络传输工具
  8. Spring@Import注解的三种用法
  9. Delphi中Chrome Chromium、Cef3学习笔记(三)
  10. stegsolve---图片隐写查看器