[HNOI2012]永无乡

每个联通块的点集用动态开点线段树维护

并查集维护图

合并时把线段树也合并就好了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cctype>
  5. #define re register
  6. #define gc getchar
  7. using namespace std;
  8. void chread(char &x){
  9. char c=gc();
  10. while(!isupper(c)) c=gc();
  11. x=c;
  12. }
  13. void read(int &x){
  14. char c=gc();x=; bool f=;
  15. while(!isdigit(c)) f=(f&&c!='-'),c=gc();
  16. while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=gc();
  17. x=f?x:-x;
  18. }
  19. void swap(int &a,int &b){a^=b;b^=a;a^=b;}
  20. #define N 100002
  21. #define M 600002
  22. struct edge{int u,v;bool del;}b[M];
  23. struct node{
  24. int sum,lc,rc;
  25. }c[M<<];
  26. int n,m,t,u,val[N],fa[N],rt[N],ttp,id[N];
  27. double ans;
  28.  
  29. void update(int &o,int l,int r,int v,int k){//插入
  30. if(!o) o=++u;
  31. if(l==r) {c[o].sum+=k; return;}
  32. int mid=l+((r-l)>>);
  33. if(v<=mid) update(c[o].lc,l,mid,v,k);
  34. else update(c[o].rc,mid+,r,v,k);
  35. c[o].sum=c[c[o].lc].sum+c[c[o].rc].sum;
  36. }
  37. void merge(int &o,int pr){//合并
  38. if(!o||!pr) {o+=pr;return;}
  39. c[o].sum+=c[pr].sum;
  40. merge(c[o].lc,c[pr].lc);
  41. merge(c[o].rc,c[pr].rc);
  42. }
  43. int query(int o,int l,int r,int k){//询问
  44. if(l==r) return l;
  45. int mid=l+((r-l)>>);
  46. if(k<=c[c[o].lc].sum) return query(c[o].lc,l,mid,k);
  47. else return query(c[o].rc,mid+,r,k-c[c[o].lc].sum);
  48. }
  49. int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
  50. void uni(int x,int y){//并查集合并
  51. int r1=find(x),r2=find(y);
  52. if(r1!=r2){
  53. merge(rt[r1],rt[r2]);
  54. fa[r2]=r1;
  55. }
  56. }
  57. int ask(int x,int k){
  58. int ffa=find(x);
  59. return k>c[rt[ffa]].sum ?-:id[query(rt[ffa],,n,k)];
  60. }
  61. int main(){
  62. char opt; int q1,q2;
  63. read(n); read(m);
  64. for(re int i=;i<=n;++i){
  65. read(val[i]),id[val[i]]=i,fa[i]=i;
  66. update(rt[i],,n,val[i],);
  67. }
  68. for(re int i=;i<=m;++i) read(q1),read(q2),uni(q1,q2);
  69. read(t);
  70. for(re int i=;i<=t;++i){
  71. chread(opt); read(q1); read(q2);
  72. switch(opt){
  73. case 'B':{uni(q1,q2); break;}
  74. case 'Q':{printf("%d\n",ask(q1,q2)); break;}
  75. }
  76. }
  77. return ;
  78. }

bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)的更多相关文章

  1. BZOJ2733 [HNOI2012]永无乡(并查集+线段树合并)

    题目大意: 在$n$个带权点上维护两个操作: 1)在点$u,v$间连一条边: 2)询问点$u$所在联通块中权值第$k$小的点的编号,若该联通块中的点的数目小于$k$,则输出$-1$: 传送门 上周的模 ...

  2. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  3. bzoj 2733 永无乡 - 并查集 - 线段树

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

  4. 【洛谷P3224】永无乡 并查集+Splay启发式合并

    题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...

  5. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

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

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

  7. 洛谷 P3224 [HNOI2012]永无乡 解题报告

    P3224 [HNOI2012]永无乡 题目描述 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 ...

  8. P3224 [HNOI2012]永无乡 题解

    P3224 [HNOI2012]永无乡 题解 题意概括 有若干集合,每个集合最初包含一个值,和一个编号1~n.两个操作:合并两个集合,查询包含值x的集合中第k大值最初的集合编号. 思路 维护集合之间关 ...

  9. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

随机推荐

  1. django实现瀑布流、组合搜索、阶梯评论、验证码

    django实现图片瀑布流布局 我们在一些图片网站上经常会看到,满屏都是图片,而且图片都大小不一,却可以按空间排列.默认一个div是占用一行,当想把div里的图片并排显示的时候,只能使用float属性 ...

  2. c++11——type_traits 类型萃取

    一. c++ traits traits是c++模板编程中使用的一种技术,主要功能:     把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用tr ...

  3. EUI EXML内部类Skin和ItemRenderer

    没认真看过...现在试试... EXMl支持内部类 两种支持做为内部类的:Skin和ItemRenderer 优点: 这种最大的好处就是皮肤如果只用一次,不需要单独写成一个exml文件,只需要写在组件 ...

  4. 使用as3crypto在Flex中实现AES加密

    要在Flex中实现AES加密,可以通过as3crypto实现.但是as3crypto本身的用法比较复杂,一般是封装一下再调用. 下面是9RIA上的一篇文章给出的一个实现,使用中稍感不方便(见注释): ...

  5. 【BZOJ2217】[Poi2011]Lollipop 乱搞

    [BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...

  6. Git的配置和使用

    eclipse中Git的配置 可以参考http://www.cnblogs.com/zhxiaomiao/archive/2013/05/16/3081148.html, http://blog.cs ...

  7. 收集一些常用的CDN链接!无需下载快速使用!

    一些常用的CDN链接,可以到这里看: http://www.bootcdn.cn/ 这个网站查找资源的方式很简单,后缀加上要查找的名字即可: 例如: http://www.bootcdn.cn/boo ...

  8. linux防火墙iptables

    2.1 框架图 -->PREROUTING-->[ROUTE]-->FORWARD-->POSTROUTING--> mangle | mangle ^ mangle n ...

  9. HOJ 1936&POJ 2955 Brackets(区间DP)

    Brackets My Tags (Edit) Source : Stanford ACM Programming Contest 2004 Time limit : 1 sec Memory lim ...

  10. 牛客网多校赛第七场J--Sudoku Subrectangle

    链接:https://www.nowcoder.com/acm/contest/145/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...