好久没做题了,写道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的更多相关文章

  1. 【主席树 启发式合并】bzoj3123: [Sdoi2013]森林

    小细节磕磕碰碰浪费了半个多小时的时间 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M ...

  2. 【BZOJ-3123】森林 主席树 + 启发式合并

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2738  Solved: 806[Submit][Status] ...

  3. [bzoj3123] [SDOI2013]森林 主席树+启发式合并+LCT

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  4. 【bzoj3123】[Sdoi2013]森林 倍增LCA+主席树+启发式合并

    题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...

  5. P3302 [SDOI2013]森林(主席树+启发式合并)

    P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...

  6. Bzoj2534:后缀自动机 主席树启发式合并

    国际惯例的题面:考虑我们求解出字符串uvu第一个u的右端点为i,第二个u的右端点为j,我们需要满足什么性质?显然j>i+L,因为我们选择的串不能是空串.另外考虑i和j的最长公共前缀(也就是说其p ...

  7. BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并

    BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20 ...

  8. Bzoj 3123: [Sdoi2013]森林(主席树+启发式合并)

    3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 第一行包含一个正整数testcase,表示当前 ...

  9. Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...

  10. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

随机推荐

  1. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  2. HDU5556 Land of Farms(二分图 2015 合肥区域赛)

    容易想到将问题转化为求图的独立数问题 ,但求一般图的独立集是一个NPC问题,需要一些转化. 状态压缩,枚举每个上古农场是否选择,然后将剩下的新农场根据i + j奇偶性分为x , y集. 结果为 max ...

  3. 用CocoaPods做iOS程序的依赖管理(转摘)

    转摘自:http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/ 文档更新说明 2012-1 ...

  4. view的setTag() 和 getTag()应用 (转)

    原文地址:http://www.cnblogs.com/qingblog/archive/2012/07/03/2575140.html View中的setTag(Onbect)表示给View添加一个 ...

  5. Cygwin的安装与配置

    去cygwin的官网去下载: 安装: 初次安装 卸载 使用过程中安装新的工具包 参考http://blog.csdn.net/superbinbin1/article/details/10147421 ...

  6. zoj 3644(dp + 记忆化搜索)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...

  7. Arduino101学习笔记(七)—— 时间API

    1.毫秒时间 获取机器运行的时间长度, 单位毫秒. 系统最长的记录时间为9小时22分, 如果超出时间将从0开始. 警告: 时间为 unsigned long类型, 如果用 int 保存时间将得到错误结 ...

  8. Windows安装java

    1.下载并安装java(jdk)//在官网下载即可——http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363. ...

  9. Java会出现"unreachable code"错误的几个例子

    public class exam { static int num=5; static int m1(){ try{ num=6; throw new NullPointerException(); ...

  10. linux安装配置SVN并设置钩子

    安装说明 系统环境:CentOS-6.3安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN软件 检查已安装版本 #检查是否安装了低版本的SVN 1 rpm ...