每个节点继承父节点的树,则答案为query(root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y)]])

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100010;
struct poi{int size,lt,rt;}tree[maxn*20];
struct zs{int too,pre;}e[maxn<<1];
int n,m,x,y,z,sz,tot,N;
int d[maxn],f[maxn][20],last[maxn],root[maxn],v[maxn],b[maxn],num[maxn];
inline void read(int &k)
{int f=1;k=0;char c=getchar();while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();k*=f;
}
inline void add(int x,int y){e[++tot].too=y;e[tot].pre=last[x];last[x]=tot;}
void insert(int &x,int l,int r,int cx)
{tree[++sz]=tree[x];tree[sz].size++;x=sz;if(l==r)return;int mid=(l+r)>>1;if(cx<=mid)insert(tree[x].lt,l,mid,cx);else insert(tree[x].rt,mid+1,r,cx);
}
int query(int a,int b,int c,int d,int l,int r,int k)
{if(l==r)return l;int mid=(l+r)>>1;int t1=tree[a].lt,t2=tree[b].lt,t3=tree[c].lt,t4=tree[d].lt;int tmp=tree[t1].size+tree[t2].size-tree[t3].size-tree[t4].size;if(tmp>=k)return query(t1,t2,t3,t4,l,mid,k);return query(tree[a].rt,tree[b].rt,tree[c].rt,tree[d].rt,mid+1,r,k-tmp);
}
void dfs(int x,int fa)
{root[x]=root[fa];insert(root[x],1,N,v[x]);d[x]=d[fa]+1;f[x][0]=fa;for(int i=last[x];i;i=e[i].pre)if(e[i].too!=fa)dfs(e[i].too,x);
}
inline int lca(int x,int y)
{if(d[x]<d[y])swap(x,y);for(int i=19;i>=0;i--)if(d[f[x][i]]>=d[y])x=f[x][i];if(x==y)return x;for(int i=19;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];return f[x][0];
}
int main()
{read(n);read(m);for(int i=1;i<=n;i++)read(v[i]),b[i]=v[i];N=n;sort(b+1,b+1+N);N=unique(b+1,b+1+N)-b-1;for(int i=1;i<=n;i++)x=lower_bound(b+1,b+1+N,v[i])-b,num[x]=v[i],v[i]=x;for(int i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);dfs(1,0);for(int j=1;j<20;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];int lan=0;for(int i=1;i<=m;i++){read(x);read(y);read(z);x^=lan;int fq=lca(x,y);printf("%d",lan=num[query(root[x],root[y],root[fq],root[f[fq][0]],1,N,z)]);if(i!=m)puts("");}
}

View Code

转载于:https://www.cnblogs.com/Sakits/p/7593517.html

bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)相关推荐

  1. 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 ...

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

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

  3. bzoj2588: Spoj 10628. Count on a tree 主席树

    在每一个点的父亲做主席树,每次访问时用两个点的和减去其LCA和LCA父亲的和即可. #include<bits/stdc++.h> using namespace std; inline ...

  4. 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 ...

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

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

  6. 主席树 || 可持久化线段树 || 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) ...

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

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

  8. BZOJ2588 Count on a tree DFS序+LCA+值域主席树

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

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

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

最新文章

  1. 2022-2028年中国智慧物流行业深度调研及投资前景预测报告(全卷)
  2. 有关计算机辅助教学方面的问题,浅析高校计算机辅助教学应用的有关问题
  3. OpenCV信息流Alpha遮罩
  4. 5G可能和你想象的完全不同!(文末福利)
  5. Bootstrap组件_媒体对象,列表组
  6. The 2019 ICPC Asia Shanghai Regional Contest
  7. 使用Advanced Installer将.exe程序重新封装为.msi程序
  8. PHP socket初探 --- 一些零碎细节的拾漏补缺
  9. linux的启动流程和加载程序
  10. mac上安装webpack报错解决方法Hit error EACCES: permission denied, mkdir ‘/usr/local/lib/node_modules/webpack
  11. 贺利坚老师汇编课程32笔记:处理字符串——大小写转换通过与和或运算加减20H
  12. BitmapFactory.decodeResource(res, id); 第一个参数跟第二个参数有什么关系?
  13. java 性能测试文档模板_最好用的数据库文档生成工具
  14. 对服务器端接口的调用,自己手写了一个脚本,但返回信息的中文总是乱码(这个方法很不错,重要的是解决思路,寻找手写脚本与录制脚本 生成目录文件的区别)...
  15. Laravel 5.4 首次搭建,从 clone 到运行成功
  16. 软件测试基础知识总结
  17. 【Pix4d精品教程】Pix4d项目空三结果精度评估完整解决方案(建议收藏)
  18. MongoDB客户端命令总结
  19. 在cmd中编译C语言方法
  20. win10下Anaconda虚拟环境安装pycocotools

热门文章

  1. Python矩阵的用法(使用numpy)
  2. LIBSVM使用方法
  3. api 规则定义_API有规则,而且功能强大
  4. centos有趣软件包_这5个软件包使学习R变得有趣
  5. PHP的构成及工作原理
  6. RubyMine 1.0加入Ruby IDE大家庭
  7. IAR在写结构体时不提示_智能物流装车系统的结构优化与改进
  8. python3 for_python3 for循环-range遍历
  9. Java 调用 Caffe_解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)...
  10. csp怎么给线条描边_PS的四种“描边”方式你都知道吗?Photoshop小知识