主席树+启发式合并(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 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
随机推荐
- Pyqt QSplashScreen启动画面
多大数应用程序启动时都会在程序完全启动时显示一个启动画面,在程序完全启动后消失.程序启动画面可以显示一些有关产品的信息,让用户在等待程序启动的同时了解有关产品的功能,也是一个宣传的方式.QSplash ...
- 栈与队列:refresh的停车场
数据结构实验之队列一:排队买饭 Time Limit: 1000MS Memory limit: 65536K 题目描述 中午买饭的人特多,食堂真是太拥挤了,买个饭费劲,理工大的小孩还是很聪明的,直接 ...
- js 横幅播放
js 横幅播放 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- 使用Visual Studio Code开发AngularJS应用
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:VSC发布之后,尤其最近刚刚更新到0.3之后,社区出现了很多介绍VSC使用的好文章.比 ...
- 并发异步处理队列 .NET 4.5+
namespace Test { using System; using System.Threading; using System.Threading.Tasks; using Microshao ...
- FrameLayout
FrameLayout是最简单的布局了. ① 所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. ② 该布局container可以用来占有屏幕的某块区域来显示单一的对象
- vmware虚拟机检测
jpg改rar
- Java学习随笔3:遍历文件夹及文件的读取和写入
import java.io.File; /** * 遍历文件夹 */ public class ScannerFile { public static void main(String[] args ...
- hdu 1069 Monkey and Banana
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 使用Genymotion安装APK出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE的解决办法
当我们安装好Genymotion后,把Android运用部署到上面调试时,console控制台会报错:Installation error: INSTALL_FAILED_CPU_ABI_INCOMP ...