bzoj2733 [ HNOI2012 ] -- 并查集+线段树合并
来源:互联网 发布:c语言计算 编辑:程序博客网 时间:2024/06/01 08:27
用并查集记录每个联通块的根节点,每个联通块建一棵线段树,合并时合并线段树就可以了。bzoj2733
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define N 100010 6 struct node{ 7 int l,r,x; 8 }c[N*20]; 9 int i,j,k,n,m,l,r,a[N],x,y,Rt[N],Num,b[N],f[N],f1,f2;10 char s[2];11 inline int Find(int x){return x==f[x]?x:f[x]=Find(f[x]);}12 inline void Update(int& Node,int l,int r,int x){13 if(!Node)Node=++Num;14 if(l==r){c[Node].x++;return;} 15 int Mid=l+r>>1;16 if(Mid<x)Update(c[Node].r,Mid+1,r,x);else Update(c[Node].l,l,Mid,x);17 c[Node].x=c[c[Node].l].x+c[c[Node].r].x; 18 }19 inline int Merge(int x,int y){20 if(!y)return x;21 if(!x)return y;22 c[x].l=Merge(c[x].l,c[y].l);23 c[x].r=Merge(c[x].r,c[y].r);24 c[x].x=c[c[x].l].x+c[c[x].r].x;25 return x;26 }27 inline int Query(int Node,int l,int r,int R){28 if(l>R||!Node)return 0;29 if(r<=R)return c[Node].x;30 int Mid=l+r>>1;31 return Query(c[Node].l,l,Mid,R)+Query(c[Node].r,Mid+1,r,R);32 }33 inline int Get_Ans(int x,int k){34 int l=1,r=n,Mid;35 while(l<=r){36 Mid=l+r>>1;37 if(Query(Rt[x],1,n,Mid)>=k)r=Mid-1;else l=Mid+1;38 }39 if(l>n)return -1;return b[l];40 }41 int main()42 {43 scanf("%d%d",&n,&m);44 for(i=1;i<=n;i++)scanf("%d",&a[i]),b[a[i]]=i,f[i]=i;45 while(m--)scanf("%d%d",&x,&y),f[Find(x)]=Find(y);46 for(i=1;i<=n;i++)Update(Rt[Find(i)],1,n,a[i]);47 scanf("%d",&m);48 while(m--){49 scanf("%s%d%d",s,&x,&y);50 if(s[0]=='Q')printf("%d\n",Get_Ans(Find(x),y));else{51 f1=Find(x);f2=Find(y);52 if(f1!=f2){53 f[f1]=f2;54 Rt[f2]=Merge(Rt[f1],Rt[f2]);55 }56 }57 }58 return 0;59 }
阅读全文
0 0
- [BZOJ2733][HNOI2012永无乡][线段树合并+并查集]
- bzoj2733 [ HNOI2012 ] -- 并查集+线段树合并
- [bzoj2733][HNOI2012]永无乡 线段树合并+并查集
- [BZOJ2733][HNOI2012]永无乡(并查集+splay启发式合并)
- [HNOI2012 永无乡]线段树+并查集
- BZOJ2733线段树合并
- BZOJ2733 [HNOI2012]永无乡 平衡树启发式合并
- [BZOJ2733]HNOI2012永无乡|平衡树启发式合并
- [BZOJ2733][HNOI2012][启发式合并][平衡树]永无乡
- [平衡树+启发式合并] BZOJ2733: [HNOI2012]永无乡
- BZOJ 2733 [HNOI2012] 永无乡 [线段树+并查集做法]
- bzoj2733 永无乡 线段树合并
- [BZOJ2733][HNOI2012]永无乡(平衡树+启发式合并)
- BZOJ_P2733/Codevs_P1477 [HNOI2012]永无乡(Treap+启发式合并+并查集)
- 线段树合并 [HNOI2012]永无乡
- bzoj2733: [HNOI2012]永无乡 splay+启发式合并
- 【bzoj2733】【HNOI2012】【永无乡】【treap+启发式合并】
- 【BZOJ2733】[HNOI2012]永无乡【启发式合并】【Splay】
- bzoj1251 -- splay
- CSDN博客中写代码
- bzoj1911 [ APIO2010 ] -- 斜率优化DP
- 架构师学长分享
- 3.写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
- bzoj2733 [ HNOI2012 ] -- 并查集+线段树合并
- bzoj2002 [ HNOI2010 ] -- LCT
- bzoj [ 2017省队十连测推广赛1 ] ( 4765 && 4766 && 4767 )题解
- bzoj2049 [ SDOI2008 ] -- LCT
- bzoj2843 -- LCT
- 设置图片圆角加阴影效果
- flex布局(3)
- 51Nod 1228 -- 伯努利数
- bzoj4771 -- dfs序+倍增+主席树