【题解】

  蜜汁强制在线。。。

  每个点开一个从它到根的可持久化权值线段树。查询的时候利用差分的思想在树上左右横跳就好了。

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 100010
 4 #define rg register
 5 #define ls (a[u].l)
 6 #define rs (a[u].r)
 7 using namespace std;
 8 int n,n2,m,tot,root[N],last[N],dep[N],top[N],hvy[N],fa[N],size[N],val[N],b[N];
 9 struct tree{
10     int sum,l,r;
11 }a[N*80];
12 struct edge{
13     int to,pre;
14 }e[N<<1];
15 inline int read(){
16     int k=0,f=1; char c=getchar();
17     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
18     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
19     return k*f;
20 }
21 inline int qlca(int x,int y){
22     int f1=top[x],f2=top[y];
23     while(f1!=f2){
24         if(dep[f1]<dep[f2]) swap(x,y),swap(f1,f2);
25         x=fa[f1]; f1=top[x];
26     }
27     return dep[x]<dep[y]?x:y;
28 }
29 void update(int &u,int l,int r,int pos){
30     a[++tot]=a[u]; a[u=tot].sum++;
31     if(l==r) return;
32     int mid=(l+r)>>1;
33     if(pos<=mid) update(ls,l,mid,pos);
34     else update(rs,mid+1,r,pos);
35 }
36 int query(int u,int v,int lca,int f,int l,int r,int k){
37     if(l==r) return l;
38     int tmp=a[ls].sum+a[a[v].l].sum-a[a[lca].l].sum-a[a[f].l].sum,mid=(l+r)>>1;
39     return k<=tmp?query(ls,a[v].l,a[lca].l,a[f].l,l,mid,k):query(rs,a[v].r,a[lca].r,a[f].r,mid+1,r,k-tmp);
40 }
41 void dfs1(int x){
42     size[x]=1; dep[x]=dep[fa[x]]+1;
43     root[x]=root[fa[x]]; update(root[x],1,n2,val[x]);
44     for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=fa[x]){
45         fa[to]=x; dfs1(to);
46         size[x]+=size[to];
47         if(size[to]>size[hvy[x]]) hvy[x]=to;
48     }
49 }
50 void dfs2(int x,int tp){
51     top[x]=tp;
52     if(hvy[x]) dfs2(hvy[x],tp);
53     for(rg int i=last[x],to;i;i=e[i].pre)
54         if((to=e[i].to)!=fa[x]&&to!=hvy[x]) dfs2(to,to);
55 }
56 int main(){
57     n=read(); m=read();
58     for(rg int i=1;i<=n;i++) val[i]=b[i]=read();
59     sort(b+1,b+1+n); n2=unique(b+1,b+1+n)-b-1;
60     for(rg int i=1;i<=n;i++) val[i]=lower_bound(b+1,b+1+n2,val[i])-b;
61     for(rg int i=1;i<n;i++){
62         int u=read(),v=read();
63         e[++tot]=(edge){v,last[u]}; last[u]=tot;
64         e[++tot]=(edge){u,last[v]}; last[v]=tot;
65     }
66     tot=0; dfs1(1); dfs2(1,1);
67     int last=0;
68     while(m--){
69         int u=read()^last,v=read(),k=read(),l=qlca(u,v),f=fa[l];
70         printf("%d\n",last=b[query(root[u],root[v],root[l],root[f],1,n2,k)]);
71     }
72     return 0;
73 }

View Code

转载于:https://www.cnblogs.com/DriverLao/p/8796247.html

洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree相关推荐

  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( LCA + 主席树 )

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

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

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

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

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

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

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

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

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

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

  9. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

最新文章

  1. matlab画图(复数的直角坐标和极坐标)(-)
  2. python编写直角三角形边长公式_304不锈钢的重量计算公式,留着总有用处
  3. 服务器的安装文件,服务器存储安装文件
  4. 20 分钟教你搞懂 Git!
  5. 【并行计算-CUDA开发】CUDA shared memory bank 冲突
  6. 把wasm反编译出来
  7. 企业GDPR安全隐私合规性指南
  8. 电子设计大赛-AD与DA电路设计
  9. 安卓开发调用python脚本_android开发调用python脚本
  10. 项目管理(一) - RFP、合同与SOW的内容与区别
  11. 【虚拟仿真】Unity3D中实现UI跟随3D模型旋转移动、UI一直面朝屏幕
  12. iOS和安卓的base64
  13. 求极值函数-MATLAB
  14. html铺满整个页面_html 怎么让背景图铺满整个页面?
  15. 戴尔d系列服务器,戴尔科技集团推出两款全新VxRail产品
  16. uniapp添加阿里字体图标库图标
  17. vue下载大文件时浏览器不显示下载进度
  18. ADD_MONTHS函数的使用
  19. input之怎么清除默认值
  20. java的memset怎么写_memset函数使用详解

热门文章

  1. 语音包mp3_目标明确,为运动而造 ,自带MP3功能的南卡RUNNER PRO骨传导耳机
  2. 时针与分针的夹角的易错点
  3. lua游戏脚本实例源码_Redis Lua脚本中学教程(上)
  4. 路由算法之距离矢量算法和链路状态算法
  5. 试题11 蒜头君的随机数(排序和去重)
  6. OpenGL基础26:Assimp库
  7. bzoj 1191: [HNOI2006]超级英雄Hero
  8. 知名互联网公司系统架构图[第1期]
  9. jQuery Mobile事件,开发全解+完美注释
  10. 论计算机网络的发展及运用,试论计算机网络发展及其应用研究