bzoj2588: Spoj 10628. Count on a tree 主席树
在每一个点的父亲做主席树,每次访问时用两个点的和减去其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 主席树相关推荐
- SPOJ 10628 Count on a tree 主席树 附数据生成器
很奇怪的题啊,感觉思路和别人一样,但是我得用快速IO才能AC--不然就T 没用快速output,只用了快速input 而且居然限制代码长度...代码要短于6000B,我改了好久啊 题目大意:给一棵树, ...
- 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 ...
- SPOJ COT Count on a tree 主席树
题意: 给\(n(1 \leq n \leq 10^5)\)一棵树,每个点有个权值. 还有\(m(1 \leq m \leq 10^5)\)个询问: \(u \, v \, k\),查询路径\(u \ ...
- 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 ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- 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 ...
- BZOJ 2588 Spoj 10628 Count on a tree | 树上主席树
BZOJ 2588 Count on a tree 题面 求树上两点之间路径上第k大的点权. 题解 一开始看到这道题觉得是树剖,然后又听说是主席树,然后以为是主席树+树剖,差点没吓死-- 然后发现,如 ...
- 主席树 || 可持久化线段树 || 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) ...
- 洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree
[题解] 蜜汁强制在线... 每个点开一个从它到根的可持久化权值线段树.查询的时候利用差分的思想在树上左右横跳就好了. 1 #include<cstdio> 2 #include<a ...
最新文章
- CVPR 2020 论文大盘点-全景分割与视频目标分割篇
- 耗时三小时整理的机器视觉知识-建议收藏转发
- 如何再造一个百度贴吧兼谈如何改造园子的团队
- java 封装 继承和多态
- Javascript创建类的七种方法
- mysql权限清理_mysql清理用户权限
- Hibernate配置数据源,数据库连接池
- 开源免费的.NET图像即时处理的组件ImageProcessor
- CSDN,CNBLOGS博客文章一键转载插件 终于更新了!
- 大厂offer手到擒来,Java面试真题精选
- Tapestry 和 JSF
- spring boot 处理自定义注解
- iqc工作职责和工作内容_新媒体实习生是做什么的?新媒体实习生岗位职责工作内容...
- Shiro和Zuul权限管理整合方案
- Android Gradle配置资源前缀
- 多边形的扫描转换算法 c语言,C++程序例题:多边形扫描转换算法
- c语言循环丘比特之箭,《我的世界》用两条指令驾驭命令方块 发射爱心骑筋斗云无所不能...
- fabric-ca-client 详解动态添加组织
- 全网最详细最基础的网络安全入门教程
- java实现word文档转pdf,并添加水印
热门文章
- 蓝桥杯 ADV-21 算法提高 多项式输出
- [Java] 蓝桥杯ALGO-11 算法训练 瓷砖铺放
- [Java] 蓝桥杯BASIC-19 基础练习 完美的代价
- 安装oh-my-zsh后terminal/iterm命令行终端前面用户计算机名消失之如何出现
- 蓝桥杯 ADV-81 算法提高 数的运算
- PHP可以读取什么配置文件,PHP读取配置文件类实例
- linux中shell curl命令获取http状态码--------强大的网络传输工具
- Spring@Import注解的三种用法
- Delphi中Chrome Chromium、Cef3学习笔记(三)
- stegsolve---图片隐写查看器