bzoj 2733 永无岛
裸的splay启发式合并,其实就是用队列实现的暴力合并,轻松写过~
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #define maxn 200000 7 using namespace std; 8 9 int c[maxn][2]; 10 int fa[maxn],f[maxn],rank[maxn],size[maxn],q[maxn]; 11 int n,m,num,p; 12 13 inline int find(int i) 14 { 15 return (!f[i])?i:f[i]=find(f[i]); 16 } 17 18 inline void update(int x) 19 { 20 if (!x) return ; 21 size[x]=size[c[x][0]]+size[c[x][1]]+1; 22 } 23 24 inline void rotate(int x) 25 { 26 int y=fa[x],z=fa[y]; 27 int p=(c[y][1]==x),q=p^1; 28 if (fa[y]) 29 if (c[z][0]==y) c[z][0]=x; else c[z][1]=x; 30 fa[x]=z; fa[y]=x; fa[c[x][q]]=y; 31 c[y][p]=c[x][q]; c[x][q]=y; 32 update(y); 33 } 34 35 inline void splay(int x) 36 { 37 while (fa[x]) 38 { 39 int y=fa[x],z=fa[y]; 40 if (fa[y]) 41 if ((c[y][0]==x)xor(c[z][0]==y)) rotate(x); else rotate(y); 42 rotate(x); 43 } 44 update(x); 45 } 46 47 inline void insert(int &t,int anc,int x) 48 { 49 if (t==0) 50 { 51 t=x; 52 fa[x]=anc; 53 size[x]=1; 54 splay(x); 55 return; 56 } 57 if (rank[x]<=rank[t]) insert(c[t][0],t,x); 58 else insert(c[t][1],t,x); 59 update(t); 60 } 61 62 inline void merge(int x,int y) 63 { 64 if (size[x]>size[y]) swap(x,y); 65 splay(x); splay(y); 66 int head=0,tail=1; 67 q[0]=y; q[1]=x; 68 while (head<tail) 69 { 70 int now=q[++head]; 71 if (c[now][0]) q[++tail]=c[now][0]; 72 if (c[now][1]) q[++tail]=c[now][1]; 73 c[now][0]=c[now][1]=0; 74 insert(q[head-1],0,now); 75 } 76 //splay(x); 77 } 78 79 inline int search(int t,int k) 80 { 81 if (k>size[t]) return -1; 82 if (k==size[c[t][0]]+1) return t; 83 if (k<size[c[t][0]]+1) return search(c[t][0],k); 84 if (k>size[c[t][0]]+1) return search(c[t][1],k-size[c[t][0]]-1); 85 } 86 87 int main() 88 { 89 //freopen("never.in","r",stdin); 90 scanf("%d %d",&n,&m); 91 for (int i=1;i<=n;i++) scanf("%d",&rank[i]),size[i]=1; 92 int x,y; 93 for (int i=1;i<=m;i++) 94 { 95 scanf("%d %d",&x,&y); 96 if (find(x)!=find(y)) 97 { 98 merge(x,y); 99 f[find(x)]=find(y); 100 } 101 } 102 //for (int i=0;i<=n;i++) cout<<i<<' '<<fa[i]<<' '<<c[i][0]<<' '<<c[i][1]<<' '<<size[i]<<endl; 103 scanf("%d\n",&p); 104 char sign; 105 for (int i=1;i<=p;i++) 106 { 107 scanf("%c %d %d\n",&sign,&x,&y); 108 //cout<<sign<<endl; 109 if (sign=='B') 110 { 111 if (find(x)!=find(y)) 112 { 113 merge(x,y); 114 f[find(x)]=find(y); 115 } 116 } 117 else 118 { 119 splay(x); 120 int ans=search(x,y); 121 printf("%d\n",ans); 122 } 123 } 124 return 0; 125 }
转载于:https://www.cnblogs.com/zig-zag/archive/2013/03/28/2987820.html
bzoj 2733 永无岛相关推荐
- bzoj2733永无乡
永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3850 Solved: 2061 [Submit][Sta ...
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4108 Solved: 2195 [Submit][Sta ...
- [bzoj2733]永无乡 [bzoj1503]郁闷的出纳员
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1321 Solved: 693 [Submit][Stat ...
- [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 洛谷P3224【HNOI2012】永无乡
洛谷P3224[HNOI2012]永无乡 题目大意 有 n n n个点,每个点都有一个重要度.先连接 m m m条边,然后有 q q q次操作: B x y 表示连接点 x x x和点 y y y Q ...
- HNOI 2012 永无乡
codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛 时间限制: 1 s 空间限制: 128000 KB 题目描述 Descr ...
最新文章
- SAP的安装后基本设定
- gsl eclipse
- git bash、eclipse中git插件提交出现冲突以及解决办法
- html(4)标签form表单——基础
- Spring5的Web 组件
- led显示屏控制卡接线图解_Led显示屏出现花屏是什么原因
- linux系统最大打开文件数(/etc/security/limits.conf:待更新其他设置)
- Android 手机常见问答
- php发送http put/patch/delete请求
- GitHub上不错的Android开源项目(二)
- 正则化与数据先验分布的关系
- idea断点调试继续执行快捷键(keymap设置了eclipse)
- 美团集群调度系统的云原生实践
- 面试记录五:腾讯后台研发
- Ubuntu 16.04 安装VSCode
- 「产品读书」精益创业
- 高项、高级项目管理师论文-质量管理
- php论坛首页一般是什么,bbs是什么
- 树莓派1——摄像头实时视频和截图
- java中字输入输出异常_Java:详解Java中的异常(Error与Exception)