裸的splay启发式合并,其实就是用队列实现的暴力合并,轻松写过~

Neverland

  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 永无岛相关推荐

  1. bzoj2733永无乡

    永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...

  2. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  3. bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3850  Solved: 2061 [Submit][Sta ...

  4. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

  5. [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4108  Solved: 2195 [Submit][Sta ...

  6. [bzoj2733]永无乡 [bzoj1503]郁闷的出纳员

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1321  Solved: 693 [Submit][Stat ...

  7. [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  8. 洛谷P3224【HNOI2012】永无乡

    洛谷P3224[HNOI2012]永无乡 题目大意 有 n n n个点,每个点都有一个重要度.先连接 m m m条边,然后有 q q q次操作: B x y 表示连接点 x x x和点 y y y Q ...

  9. HNOI 2012 永无乡

    codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛  时间限制: 1 s  空间限制: 128000 KB 题目描述 Descr ...

最新文章

  1. SAP的安装后基本设定
  2. gsl eclipse
  3. git bash、eclipse中git插件提交出现冲突以及解决办法
  4. html(4)标签form表单——基础
  5. Spring5的Web 组件
  6. led显示屏控制卡接线图解_Led显示屏出现花屏是什么原因
  7. linux系统最大打开文件数(/etc/security/limits.conf:待更新其他设置)
  8. Android 手机常见问答
  9. php发送http put/patch/delete请求
  10. GitHub上不错的Android开源项目(二)
  11. 正则化与数据先验分布的关系
  12. idea断点调试继续执行快捷键(keymap设置了eclipse)
  13. 美团集群调度系统的云原生实践
  14. 面试记录五:腾讯后台研发
  15. Ubuntu 16.04 安装VSCode
  16. 「产品读书」精益创业
  17. 高项、高级项目管理师论文-质量管理
  18. php论坛首页一般是什么,bbs是什么
  19. 树莓派1——摄像头实时视频和截图
  20. java中字输入输出异常_Java:详解Java中的异常(Error与Exception)

热门文章

  1. 数值分析-列主元消去法
  2. Cesium中的几种坐标和相互转换(2)
  3. [转载]STL之priority_queue
  4. 浅谈百度阅读/文库NA端排版技术
  5. 线性代数(十) : 矩阵的列空间与零空间
  6. 日本机器人全球领先来自这三大顶尖技术
  7. 速算C语言程序设计,C语言速算24数据结构课程设计最终版(备份存档)
  8. 13,xilinx 7系列FPGA理论篇——IO_FIFO篇简介
  9. Excel暗藏的赛车游戏(转)
  10. Python的egg包