2733

思路:

  启发式合并splay(n*log^2n);

来,上代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. #define maxn 100001
  9.  
  10. int n,q,tot,ch[maxn*][],key[maxn*],w[maxn*],opi[maxn*],m;
  11. int size[maxn*],root[maxn],id[maxn*],f[maxn],cnt,dis[maxn*],lar[maxn];
  12.  
  13. inline void in(int &now)
  14. {
  15. char Cget=getchar();now=;
  16. while(Cget>''||Cget<'') Cget=getchar();
  17. while(Cget>=''&&Cget<='')
  18. {
  19. now=now*+Cget-'';
  20. Cget=getchar();
  21. }
  22. }
  23.  
  24. inline int getson(int now)
  25. {
  26. return ch[opi[now]][]==now;
  27. }
  28.  
  29. inline void updata(int now)
  30. {
  31. size[now]=w[now];
  32. if(ch[now][]) size[now]+=size[ch[now][]];
  33. if(ch[now][]) size[now]+=size[ch[now][]];
  34. }
  35.  
  36. inline void rotate(int now)
  37. {
  38. int fa=opi[now],ffa=opi[fa],pos=getson(now);
  39. ch[fa][pos]=ch[now][pos^];
  40. if(ch[fa][pos]) opi[ch[fa][pos]]=fa;
  41. if(ffa) ch[ffa][getson(fa)]=now;
  42. ch[now][pos^]=fa,opi[fa]=now,opi[now]=ffa;
  43. updata(fa),updata(now);
  44. }
  45.  
  46. inline void splay(int now,int to)
  47. {
  48. for(int fa;fa=opi[now];rotate(now))
  49. {
  50. if(opi[fa]) rotate(getson(now)==getson(fa)?fa:now);
  51. }
  52. root[to]=now;
  53. }
  54.  
  55. inline void insert(int x,int y,int to)
  56. {
  57. if(!root[to])
  58. {
  59. root[to]=++tot,key[tot]=x,w[tot]=size[tot]=,id[tot]=y;
  60. return ;
  61. }
  62. int now=root[to],fa=;
  63. while()
  64. {
  65. fa=now;
  66. if(x<key[now]) now=ch[now][];
  67. else now=ch[now][];
  68. if(!now)
  69. {
  70. now=ch[fa][x>key[fa]]=++tot;
  71. key[now]=x,id[now]=y,w[now]=size[now]=,opi[now]=fa;
  72. splay(now,to);break;
  73. }
  74. }
  75. }
  76.  
  77. inline int find(int x)
  78. {
  79. if(x==f[x]) return x;
  80. return f[x]=find(f[x]);
  81. }
  82.  
  83. inline int irank(int k,int to)
  84. {
  85. int now=root[to];
  86. while()
  87. {
  88. int dis=size[ch[now][]];
  89. if(k<=dis) now=ch[now][];
  90. else
  91. {
  92. k-=dis;
  93. if(k<=w[now])
  94. {
  95. splay(now,to);
  96. return id[now];
  97. }
  98. else k-=w[now],now=ch[now][];
  99. }
  100. }
  101. }
  102.  
  103. inline void merge(int noww,int now)
  104. {
  105. if(!now) return ;
  106. if(ch[now][]) merge(noww,ch[now][]);
  107. insert(key[now],id[now],noww);
  108. if(ch[now][]) merge(noww,ch[now][]);
  109. }
  110.  
  111. int main()
  112. {
  113. in(n),in(m);int x,y;char ch[];
  114. for(int i=;i<=n;i++) in(dis[i]),f[i]=i,insert(dis[i],i,i),lar[i]=;
  115. for(;m--;)
  116. {
  117. in(x),in(y);
  118. x=find(x),y=find(y);
  119. if(lar[x]<lar[y]) swap(x,y);lar[x]+=lar[y];
  120. if(x!=y) f[y]=x,merge(x,root[y]);
  121. }
  122. in(q);
  123. for(;q--;)
  124. {
  125. scanf("%s",ch);in(x),in(y);
  126. if(ch[]=='Q')
  127. {
  128. x=find(x);
  129. if(y<=size[root[x]]) printf("%d\n",irank(y,x));
  130. else printf("-1\n");
  131. }
  132. else
  133. {
  134. x=find(x),y=find(y);
  135. if(lar[x]<lar[y]) swap(x,y);lar[x]+=lar[y];
  136. if(x!=y) f[y]=x,merge(x,root[y]);
  137. }
  138. }
  139. return ;
  140. }

AC日记——[HNOI2012]永无乡 bzoj 2733的更多相关文章

  1. 2733: [HNOI2012]永无乡 - BZOJ

    Description 永无乡包含 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 MBSubmit: 1167  Solved: 607[Submit][Status ...

  4. BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

    不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...

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

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

  6. bzoj 2733: [HNOI2012]永无乡 -- 线段树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...

  7. Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3955  Solved: 2112[Submit][Statu ...

  8. Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...

  9. 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡

    题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...

随机推荐

  1. Entity FrameWork和Dapper的使用

    EF是微软系列下的更正苗红的重量级的ORM框架,功能强大,操作数据库的时候几乎不用写sql,可以像写C#代码一样操作数据库,尤其支持多表关联操作的时候极为方便,但是生成的sql语句性能很差,实在不敢恭 ...

  2. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 's.areaname' in 'field list'错误

    在使用mybatis框架做查询的时候,出现了如下错误: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown colum ...

  3. Windows下使用Nginx+tomcat配置负载均衡

    Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口 ...

  4. [网站公告]又拍云API故障造成图片无法上传

    大家好,今天早上8:30左右发现又拍云API出现故障,造成图片无法上传,调用图片上传API时出现错误:“The operation has timed out”. 该故障给大家带来了麻烦,望大家谅解! ...

  5. ajax向Asp.NET后端传递数组型数据

    近日,在开发一个组件的过程中,需要通过Ajax对象向Asp.NET后端传递一个比较复杂的表单,表单中的一个字段是数组类型,我能想到的办法是用JSON.stringify将前端的数组对象序列化成字符串, ...

  6. 小程序使用Canvas画饼图

    先上效果图 -------------------------------------------------------------wxml代码开始------------------------- ...

  7. JMeter学习笔记(十一) 关于 CSV Data Set Config 的 Sharing mode 对取值的影响

    关于 CSV Data Set Config 的一些介绍之前已经梳理过了,可以参考: https://www.cnblogs.com/xiaoyu2018/p/10184127.html . 今天主要 ...

  8. 1079 Total Sales of Supply Chain (25 分)(树的遍历)

    给出一颗销售供应的树,树根唯一.在树根处货物的价格为p,然后从根节点开始没往结点走一层,该层的货物价格将会在父节点的价格上增加r%.给出每个叶节点的货物量求出他们的价格之和 #include<b ...

  9. VS配置使用第三方库

    VS使用第三方库 项目设置 调整头文件引用目录 C/C++ -> General -> Additional Include Directories 添加库文件目录 Linker -> ...

  10. 聊聊、Git 常用命令

    创建本地仓库git initgit add .git commit -m "xxxxx"git remote add origin http://git.xxx.com/xxx.g ...