[Sdoi2013]森林(启发式合并+主席树)
对于操作1,显然可以使用主席树维护,然后对于一条链(x,y),假设lca为f,根为rt,则(rt,x)+(rt,y)-(rt,f)-(rt,fa[f])即为所求的链,在主席树上直接查询即可,查询方式类似于treap/splay对size的询问。
对于操作2,可以用LCT,当然也能启发式合并,每次连边时,强行把sz小的塞入sz大的即可。
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,p,a[N],b[N],rt[N],sz[N],fa[N],dep[N],f[N][];
vector<int>G[N];
namespace tree{
struct seg{int lc,rc,s;}tr[N*];
int sz;
void update(int k,int l,int r,int&rt,int prt)
{
tr[rt=++sz]=tr[prt],tr[rt].s++;
if(l==r)return;
int mid=l+r>>;
if(k<=mid)update(k,l,mid,tr[rt].lc,tr[prt].lc);
else update(k,mid+,r,tr[rt].rc,tr[prt].rc);
}
int query(int u,int v,int pu,int pv,int k,int l,int r)
{
if(l==r)return l;
int mid=l+r>>,sum=tr[tr[u].lc].s+tr[tr[v].lc].s-tr[tr[pu].lc].s-tr[tr[pv].lc].s;
if(k<=sum)return query(tr[u].lc,tr[v].lc,tr[pu].lc,tr[pv].lc,k,l,mid);
return query(tr[u].rc,tr[v].rc,tr[pu].rc,tr[pv].rc,k-sum,mid+,r);
}
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void dfs(int u,int Fa,int anc)
{
f[u][]=Fa;
for(int i=;i<=;i++)f[u][i]=f[f[u][i-]][i-];
sz[anc]++,dep[u]=dep[Fa]+,fa[u]=Fa;
int x=lower_bound(b+,b+p+,a[u])-b;
tree::update(x,,p,rt[u],rt[Fa]);
for(int i=;i<G[u].size();i++)if(G[u][i]!=Fa)dfs(G[u][i],u,anc);
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
int t=dep[x]-dep[y];
for(int i=;(<<i)<=t;i++)if(t&(<<i))x=f[x][i];
if(x==y)return x;
for(int i=;~i;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][];
}
int main()
{
int Q;scanf("%*d%d%d%d",&n,&m,&Q);
for(int i=;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i],fa[i]=i;
for(int i=,x,y;i<=m
;i++)scanf("%d%d",&x,&y),G[x].push_back(y),G[y].push_back(x);
sort(b+,b+n+);
p=unique(b+,b+n+)-b-;
for(int i=;i<=n;i++)if(!dep[i])dfs(i,,i),fa[i]=i;
char op;
int x,y,z,ans=;
while(Q--)
{
scanf(" %c%d%d",&op,&x,&y),x^=ans,y^=ans;
if(op=='Q')
{
scanf("%d",&z),z^=ans;
int Fa=lca(x,y);
printf("%d\n",ans=b[tree::query(rt[x],rt[y],rt[Fa],rt[f[Fa][]],z,,p)]);
}
else{
G[x].push_back(y),G[y].push_back(x);
int fx=find(x),fy=find(y);
if(sz[fx]<sz[fy])swap(x,y),swap(fx,fy);
dfs(y,x,fx);
}
}
}
[Sdoi2013]森林(启发式合并+主席树)的更多相关文章
- BZOJ 3123 [SDOI2013] 森林 - 启发式合并 主席树
Description 给你一片森林, 支持两个操作: 查询$x$到$y$的$K$大值, 连接两棵树中的两个点 Solution 对每个节点$x$动态开权值线段树, 表示从$x$到根节点路径上权值出 ...
- 【BZOJ3123】[SDOI2013] 森林(启发式合并主席树)
点此看题面 大致题意: 给你一片森林,有两种操作:询问两点之间的第\(k\)小点权和在两棵树之间连一条边. 前置技能:树上主席树 做这道题目,我们首先要会树上主席树. 关于树上主席树,这有一道很好的例 ...
- bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)
Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...
- BZOJ 2733 [HNOI2012]永无乡 - 启发式合并主席树
Description 1: 查询一个集合内的K大值 2: 合并两个集合 Solution 启发式合并主席树板子 Code #include<cstdio> #include<cst ...
- BZOJ3123: [Sdoi2013]森林(启发式合并&主席树)
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4813 Solved: 1420[Submit][Status ...
- [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)
传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
- 【bzoj3123】[Sdoi2013]森林 倍增LCA+主席树+启发式合并
题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...
- p3302 [SDOI2013]森林(树上主席树+启发式合并)
对着题目yy了一天加上看了一中午题解,终于搞明白了我太弱了 连边就是合并线段树,把小的集合合并到大的上,可以保证规模至少增加一半,复杂度可以是\(O(logn)\) 合并的时候暴力dfs修改倍增数组和 ...
- 洛谷 P3302 [SDOI2013]森林 Lebal:主席树 + 启发式合并 + LCA
题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: Q x y k查询点x到点y路径上所有的权值中,第k小的权 ...
随机推荐
- 吴裕雄--天生自然 JAVASCRIPT开发学习:函数
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- UML-设计模式-缓存策略
继续前一章<本地服务容错> 问题:考虑加载内存ProductCatalog缓存和基于LocalProducts文件缓存的可选方案: 一种是惰性初始化(lazy init):当实际读取外部产 ...
- FTP服务器 vsftp samba服务器 共享 smb
FTP服务器 vsftp samba服务器 共享 smb 马哥视频 参考1 参考3 参考2 参考4 vsftp服务器实现匿名用户上传.修改权限和一些设置 win7访问 地址栏输入 ftp://账号 ...
- php日期时间戳,日期函数使用
date_default_timezone_get():获得当前php的时区 date_default_timezone_set():设置当前php的时区 date("Y-m-d H-i-s ...
- python 爬虫下载英语听力新闻(npr news)为mp3格式
想通过听实时新闻来提高英语听力,学了那么多年的英语,不能落下啊,不然白费背了那么多年的单词. npr news是美国国家公共电台,发音纯正,音频每日更新,以美国为主,世界新闻为辅,比如最近我国武汉发生 ...
- POJ 1837:Balance 天平DP。。。
Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11878 Accepted: 7417 Descript ...
- 解决Maven项目报错Perhaps you are running on a JRE rather than a JDK?
问题描述: 在创建SpringMVC项目运行构建项目的时候,发现构建失败.报错信息为Maven-No compiler is provided in this environment. Perhaps ...
- Dynamics CRM - 为 Form 或者字段设置 Error Notification
在 Dynamics CRM 开发中,我们一般要利用 JS 来做一些数据验证的功能,我们也需要将验证结果显示出来,比起直接 alert 出信息来提示用户的方式,CRM 提供了更加美观和人性化的方式来通 ...
- Linux不进入网卡配置文件更改静态ip
1.找到网卡配置文件名ls /etc/sysconfig/network-scripts/ 2.备份并查看原始配置文件(若原先有配置IP的,则按照第五点方式修改) 3.修改随机自启和IP地址echo ...
- 【MySQL参数】- query_cache_type
MySQL为什么要关闭查询缓存 https://blog.csdn.net/liqfyiyi/article/details/50178591 Query cache的优化方法 https://blo ...