P3302 [SDOI2013]森林
树上第k小是裸题,然后连边操作显然只能用启发式合并
连边之后重构小的部分,重构一遍主席树和倍增数组,水的一批(逃
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int w[80010],W[80010],nw,FA[80010],SZ[80010];
il int hd(int x){return FA[x]==x?x:FA[x]=hd(FA[x]);}
int fir[80010],dis[160010],nxt[160010],id;
il vd link(int a,int b){nxt[++id]=fir[a],fir[a]=id,dis[id]=b;}
int st[17][80010],dep[80010];
int rt[80010],ls[10000010],rs[10000010],sum[10000010],cnt;
#define mid ((l+r)>>1)
il vd build(int&x,int l,int r){
x=++cnt;if(l==r)return;
build(ls[x],l,mid),build(rs[x],mid+1,r);
}
il vd update(int&x,int l,int r,const int&p){
++cnt,sum[cnt]=sum[x],ls[cnt]=ls[x],rs[cnt]=rs[x],x=cnt;
++sum[x];if(l==r)return;
if(p<=mid)update(ls[x],l,mid,p);
else update(rs[x],mid+1,r,p);
}
il int query(int&a,int&b,int&c,int&d,int l,int r,int k){
if(l==r)return l;
if(sum[ls[a]]+sum[ls[b]]-sum[ls[c]]-sum[ls[d]]<k)return query(rs[a],rs[b],rs[c],rs[d],mid+1,r,k-(sum[ls[a]]+sum[ls[b]]-sum[ls[c]]-sum[ls[d]]));
else return query(ls[a],ls[b],ls[c],ls[d],l,mid,k);
}
#undef mid
il vd dfs(int x,int fa){
rt[x]=rt[fa];dep[x]=dep[fa]+1;update(rt[x],1,nw,W[x]);
st[0][x]=fa;for(int i=1;i<17;++i)st[i][x]=st[i-1][st[i-1][x]];
for(int i=fir[x];i;i=nxt[i])if(dis[i]!=fa)dfs(dis[i],x);
}
il vd merge(int x,int y){
if(SZ[hd(x)]<SZ[hd(y)])std::swap(x,y);
link(x,y),link(y,x),dfs(y,x);SZ[hd(x)]+=SZ[hd(y)],FA[hd(y)]=hd(x);
}
il int LCA(int x,int y){
if(dep[x]<dep[y])std::swap(x,y);
int c=dep[x]-dep[y];
for(int i=16;~i;--i)if(c&(1<<i))x=st[i][x];
for(int i=16;~i;--i)if(st[i][x]^st[i][y])x=st[i][x],y=st[i][y];
if(x^y)x=st[0][x];return x;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
gi();
int n=gi(),m=gi(),q=gi(),x,y,k;
for(int i=1;i<=n;++i)W[i]=w[i]=gi();
std::sort(w+1,w+n+1);nw=std::unique(w+1,w+n+1)-w-1;
for(int i=1;i<=n;++i)W[i]=std::lower_bound(w+1,w+nw+1,W[i])-w;
build(rt[0],1,nw);
for(int i=1;i<=n;++i)rt[i]=rt[0],update(rt[i],1,nw,W[i]);
for(int i=1;i<=n;++i)FA[i]=i,SZ[i]=1,dep[i]=1;
while(m--)x=gi(),y=gi(),merge(x,y);
int lst=0;char opt[3];
while(q--){
scanf("%s",opt);
if(opt[0]=='Q'){
x=gi()^lst,y=gi()^lst,k=gi()^lst;
int lca=LCA(x,y);
printf("%d\n",lst=w[query(rt[x],rt[y],rt[lca],rt[st[0][lca]],1,nw,k)]);
}else x=gi()^lst,y=gi()^lst,merge(x,y);
}
return 0;
}
P3302 [SDOI2013]森林的更多相关文章
- P3302 [SDOI2013]森林(主席树+启发式合并)
P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...
- 洛谷 P3302 [SDOI2013]森林 解题报告
P3302 [SDOI2013]森林 题目描述 小\(Z\)有一片森林,含有\(N\)个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有\(M\)条边. 小Z希望执行\(T\)个操作,操 ...
- 洛谷 P3302 [SDOI2013]森林 Lebal:主席树 + 启发式合并 + LCA
题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: Q x y k查询点x到点y路径上所有的权值中,第k小的权 ...
- [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)
传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
- p3302 [SDOI2013]森林(树上主席树+启发式合并)
对着题目yy了一天加上看了一中午题解,终于搞明白了我太弱了 连边就是合并线段树,把小的集合合并到大的上,可以保证规模至少增加一半,复杂度可以是\(O(logn)\) 合并的时候暴力dfs修改倍增数组和 ...
- 洛谷 P3302 [SDOI2013]森林
->题目链接 题解: #include<queue> #include<cstdio> #include<cstring> #include<iostr ...
- BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]
3123: [Sdoi2013]森林 题意:一个森林,加边,询问路径上k小值.保证任意时刻是森林 LCT没法搞,树上kth肯定要用树上主席树 加边?启发式合并就好了,小的树dfs重建一下 注意 测试点 ...
- luoguP3302 [SDOI2013]森林 主席树 启发式合并
题目链接 luoguP3302 [SDOI2013]森林 题解 本来这题树上主席树暴力启发式合并就完了 结果把lca写错了... 以后再也不这么写了 复杂度\(O(nlog^2n)\) "f ...
- [BZOJ3123][Sdoi2013]森林 主席树+启发式合并
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 第一行包含一个正整数testcase,表示当 ...
随机推荐
- Intellij IDEA去除@Autowired下划线红色提示
Intellij IDEA通过@Autowired注入的对象,在不改变配置的情况下一直有红色下划线,虽然不影响运行,但是跟小Alan一样有强迫症的肯定受不鸟. 那么怎么去除它呢? 解决方式:改变@Au ...
- sh: ./bin/my_print_defaults: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录 FATAL ERROR: Neither host 'kvm' nor 'localhost' could be looked up with ./bin/resolveip Please configure the 'hostname'
初始化数据库报错: sh: ./bin/my_print_defaults: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录FATAL ERROR ...
- 如何在EF Core 使用存储过程
使用EF Core框架能快速的帮助我们进行常规的数据处理和项目开发,但是ORM虽然好用,但是在许多复杂逻辑的数据处理时,我个人还是偏向用SQL和存储过程的方式去处理,但是研究了一下目前最新版本的EF ...
- MySQL innodb中各种SQL语句加锁分析
概要 Locking read( SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),UPDATE以及DELETE语句通常会在他扫描的索引所 ...
- Git钩子详解
钩子 Git钩子是在Git仓库中特定事件发生时自动运行的脚本.可以定制一些钩子,这些钩子可以在特定的情况下被执行,分为Client端的钩子和Server端的钩子.Client端钩子被operation ...
- 使用Python+opencv2时的文件命名及路径问题
最近在做一个数字图像的小项目,在最后的界面与程序结合阶段总是出现单个程序可以运行,但是使用界面传递的参数就运行不了的情况.在网上查了很多相关错误,最终确定是文件命名问题. 错误如下: cv2.erro ...
- Django商城项目笔记No.1项目准备工作
Django商城项目笔记No.1项目准备工作 一.本项目商城属于B2C商业模式 二.项目采用前后端分离的应用模式 前端使用Vue.js 后端使用Django REST framework 1.创建gi ...
- MySQL数据库常用操作和技巧
MySQL数据库可以说是DBA们最常见和常用的数据库之一,MySQL的广泛应用,也使更多的人加入到学习它的行列之中.下面是老MySQL DBA总结的MySQL数据库最常见和最常使用的一些经验和技巧,分 ...
- C#演化过程--各个版本新增加特性
- BZOJ2744:[HEOI2012]朋友圈(最大团,乱搞)
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...