主席树+启发式合并(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 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
随机推荐
- apache linux 安装
sudo apt-get install zlib1g-dev 1.到官网下载,然后解压httpd-2.4.18.tar.gz 2.下载apr-1.5.2.tar.gz并解压 http://ar ...
- JavaScript - 基本概念
相等操作符 == 和 != 是先转换再比较 === 和 !== 是直接比较,不经过转换 中文翻译上来说叫做相等和全等.类型转换简单的概括就是高级转低级,比如说布尔字符串转数字,对象取值再转.相等比较有 ...
- [Oracle] 生产上表的列类型更新
由于粗心,数据库脚本生成的时候错将一个类型NUMBER(5)的字段类型改为 VARCHAR2(5) 直接进行表修改会报错,因为数据已经存在,不能进行更新: ); 大体思路如下: 将要更改类 ...
- 配置ogg异构oracle-mysql 双向同步注意事项
双向同步需要考虑的是怎么解决循环复制,以及同时更新一张表以谁为基准. 配置过程就不写了,大致和oracle到mysql的单向+mysql到oracle的单向差不多. 需要注意的有如下几点: 1.ora ...
- 协处理器,王明学learn
协处理器 协处理器用于执行特定的处理任务,如:数学协处理器可以控制数字处理,以减轻处理器的负担.ARM可支持多达16个协处理器,其中CP15是最重要的一个. CP15提供16组寄存器 通过提供的16组 ...
- hibernate 关联映射
关联关系大致分为两大类: 1.单向关系:只需单向访问关联端.例如:只能通过老师访问学生,或者只能通过学生访问老师. 2.双向关系:关联的两端可以互相访问.例如:老师和学生之间可以互相访问. 单向关联可 ...
- C#中var和dynamic
var与dynamic这两个关键字,只是看起来很相似,仅此而已!var表示“变量的类型是在编译时决定的”,但是dynamic表 示“变量的类型是在运行时决定的”.因此,dynamic与var具有截然不 ...
- 【项目经验】EasyUI Tree
ITOO5.0开始了,我参加了伟大的基础系统,从整体上来说,基础系统有三个职能: 1.自己的核心职能--选课(公共选修课,专业选修课),课表: 2.为其他系统提供真实数据: 3.维护信息 而近两三天, ...
- SQLServer 本地移动发布/订阅/分发数据库文件并更改逻辑名称和物理文件名
-------------------------------------------------------------------------------------------------- - ...
- CentOS配置本地yum源(使用镜像iso文件)
本人在使用yum安装软件的时候,感觉最不爽的是网络不佳时,安装的速度特别慢.所以,个人就上网search了一下如何使用Linux的安装文件作为其yum源.经过几次尝试,已经可以成功的配置了.下面是详细 ...