主席树+启发式合并(LT) BZOJ3123
好久没做题了,写道SBT又RE又T
查询:主席树裸题。
修改:对于两个树合并重建小的树。
注意fa[x][i]重新计算时要清空
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
char c=getchar();int x=,sig=;
for(;!isdigit(c);c=getchar()) if(c=='-') sig=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*sig;
}
inline void print(int x)
{
int buf[],l=;
if(!x) l++;
while(x) buf[++l]=x%,x/=;
for(;l;l--) putchar(buf[l]+'');
putchar('\n');
}
const int maxn=;
const int maxnode=;
int ls[maxnode],rs[maxnode],s[maxnode],ToT;
void update(int& y,int x,int l,int r,int pos)
{
s[y=++ToT]=s[x]+;if(l==r) return;
int mid=l+r>>;ls[y]=ls[x];rs[y]=rs[x];
if(pos<=mid) update(ls[y],ls[x],l,mid,pos);
else update(rs[y],rs[x],mid+,r,pos);
}
int query(int x1,int x2,int y1,int y2,int l,int r,int k)
{
if(l==r) return l;
int mid=l+r>>,k2=s[ls[y1]]+s[ls[y2]]-s[ls[x1]]-s[ls[x2]];
if(k<=k2) return query(ls[x1],ls[x2],ls[y1],ls[y2],l,mid,k);
return query(rs[x1],rs[x2],rs[y1],rs[y2],mid+,r,k-k2);
}
int n,m,q,val[maxn],tmp[maxn],root[maxn],lastans;
int first[maxn],next[maxn*],to[maxn*],e,fa[maxn][],dep[maxn];
int pa[maxn],sz[maxn];
void AddEdge(int a,int b)
{
to[++e]=b;next[e]=first[a];first[a]=e;
to[++e]=a;next[e]=first[b];first[b]=e;
}
void dfs(int x,int f)
{
dep[x]=dep[fa[x][]=f]+;update(root[x],root[f],,n,val[x]);
sz[pa[x]]++;
for(int i=;i<;i++) fa[x][i]=fa[fa[x][i-]][i-];
for(int i=first[x];i;i=next[i]) if(to[i]!=f) pa[to[i]]=pa[x],dfs(to[i],x);
}
int lca(int p,int q)
{
if(dep[p]<dep[q]) swap(p,q);
for(int i=;i>=;i--) if((<<i)<=dep[p]-dep[q]) p=fa[p][i];
for(int i=;i>=;i--) if(fa[p][i]!=fa[q][i]) p=fa[p][i],q=fa[q][i];
return p==q?p:fa[p][];
}
int main()
{
read();n=read();m=read();q=read();
for(int i=;i<=n;i++) tmp[i]=val[i]=read();
sort(tmp+,tmp+n+);
for(int i=;i<=n;i++) val[i]=lower_bound(tmp+,tmp+n+,val[i])-tmp;
for(int i=;i<m;i++) AddEdge(read(),read());
for(int i=;i<=n;i++) if(!fa[i][]) pa[i]=i,dfs(i,);
for(int i=;i<q;i++)
{
char tp=getchar();
while(!isalpha(tp)) tp=getchar();
if(tp=='Q')
{
int x=read()^lastans,y=read()^lastans,k=read()^lastans;
int c=lca(x,y);
print(lastans=tmp[query(root[c],root[fa[c][]],root[x],root[y],,n,k)]);
}
else
{
int u=read()^lastans,v=read()^lastans;
int x=pa[u],y=pa[v];
if(sz[x]>sz[y]) swap(x,y),swap(u,v);
pa[u]=y;AddEdge(u,v);dfs(u,v);
}
}
return ;
}
主席树+启发式合并(LT) BZOJ3123的更多相关文章
- 【主席树 启发式合并】bzoj3123: [Sdoi2013]森林
小细节磕磕碰碰浪费了半个多小时的时间 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M ...
- 【BZOJ-3123】森林 主席树 + 启发式合并
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2738 Solved: 806[Submit][Status] ...
- [bzoj3123] [SDOI2013]森林 主席树+启发式合并+LCT
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- 【bzoj3123】[Sdoi2013]森林 倍增LCA+主席树+启发式合并
题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...
- P3302 [SDOI2013]森林(主席树+启发式合并)
P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...
- Bzoj2534:后缀自动机 主席树启发式合并
国际惯例的题面:考虑我们求解出字符串uvu第一个u的右端点为i,第二个u的右端点为j,我们需要满足什么性质?显然j>i+L,因为我们选择的串不能是空串.另外考虑i和j的最长公共前缀(也就是说其p ...
- BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并
BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20 ...
- Bzoj 3123: [Sdoi2013]森林(主席树+启发式合并)
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 第一行包含一个正整数testcase,表示当前 ...
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...
- [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)
传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
随机推荐
- python装饰器入门
按别人的教程弄的. 要清楚基于类和基于函数的实现的不同之处. #!/usr/bin/env python # -*- coding: utf-8 -*- ''' class entryExit(obj ...
- FTP是否可以修改为其它端口?
对服务器的ftp端口进行了修改,把21端口改了,比如221端口,就这样用221连接的时候,连接登录成功,但打不开目录,为何,总结如下: 1.完成一个FTP的传输过程不仅仅只需要21一个端口,而是2个端 ...
- PHP连接打印机
<?php header("Content-type: text/html; charset=utf-8"); class Netprint{ public $host = ...
- PHP计算程序运行时间的类
<?php class runTime{ private $starTime; private $stopTime; private function getMicTime(){ $mictim ...
- JS自定义属性兼容
var obj={}; if(obj.dataset){ obj.dataset.original="11"; }else{ obj.getAttribute("data ...
- AES128和AES256主要区别和安全程度是多少?他们对于机器的消耗是怎样的?两者性能如何?实际开发如何选择?
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...
- LoadRunner 一些快捷键
F4 Runtime Setting F5 运行 Ctrl Alt C 注释 Ctrl Alt U 取消注释 Tab 缩进 Shift Tab 取消缩进 Ctrl L 打开参数管理对 ...
- Blog Starting...
30出头,开始Blog记录学习生活的点滴,待40时再回来一看.
- JMeter中的关联-正则表达式提取(2)
JMeter获取正则表达式中的提取的所有关联值的解决方法: 需求如下: { : ", : "results": : [ : : { : : : "total_e ...
- WebAPI身份验证
对WebAPI接口的开放当然要做控制,需要身份验证如何做到呢. 进行身份验证后的 服务器拒绝了访问! 第一步添加一个CustomHandler.cs的类 1: using System; 2: usi ...