bzoj上数组开大会T……

本来想用set瞎搞的,想了想发现不行

总之就是并查集,每个点开一个动态开点的权值线段树,然后合并的时候把值并在根上,询问的时候找出在根的线段树里找出k小值,看看这个值属于哪个岛即可

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int N=100005;
  5. int n,m,q,f[N],rt[N],tot,rl[N];
  6. char c[5];
  7. struct qwe
  8. {
  9. int ls,rs,s;
  10. }t[10000005];
  11. int read()
  12. {
  13. int r=0,f=1;
  14. char p=getchar();
  15. while(p>'9'||p<'0')
  16. {
  17. if(p=='-')
  18. f=-1;
  19. p=getchar();
  20. }
  21. while(p>='0'&&p<='9')
  22. {
  23. r=r*10+p-48;
  24. p=getchar();
  25. }
  26. return r*f;
  27. }
  28. int zhao(int x)
  29. {
  30. return f[x]==x?x:f[x]=zhao(f[x]);
  31. }
  32. void ud(int ro)
  33. {
  34. t[ro].s=t[t[ro].ls].s+t[t[ro].rs].s;
  35. }
  36. void update(int &ro,int l,int r,int p)
  37. {
  38. if(!ro)
  39. ro=++tot;
  40. if(l==r)
  41. {
  42. t[ro].s=1;
  43. return;
  44. }
  45. int mid=(l+r)>>1;
  46. if(p<=mid)
  47. update(t[ro].ls,l,mid,p);
  48. else
  49. update(t[ro].rs,mid+1,r,p);
  50. ud(ro);
  51. }
  52. void hb(int &ro,int la,int l,int r)
  53. {
  54. if(!la)
  55. return;
  56. if(!ro)
  57. {
  58. ro=la;
  59. return;
  60. }
  61. if(l==r)
  62. {
  63. t[ro].s+=t[la].s;
  64. return ;
  65. }
  66. int mid=(l+r)>>1;
  67. hb(t[ro].ls,t[la].ls,l,mid);
  68. hb(t[ro].rs,t[la].rs,mid+1,r);
  69. ud(ro);
  70. }
  71. int ques(int ro,int l,int r,int k)
  72. {
  73. if(l==r)
  74. return l;
  75. int mid=(l+r)>>1;
  76. if(t[ro].ls&&t[t[ro].ls].s>=k)
  77. return ques(t[ro].ls,l,mid,k);
  78. else
  79. return ques(t[ro].rs,mid+1,r,k-t[t[ro].ls].s);
  80. }
  81. int main()
  82. {
  83. n=read(),m=read();
  84. for(int i=1;i<=n;i++)
  85. {
  86. f[i]=i;
  87. int x=read();
  88. rl[x]=i;
  89. update(rt[i],1,n,x);
  90. }
  91. for(int i=1;i<=m;i++)
  92. {
  93. int x=read(),y=read(),fx=zhao(x),fy=zhao(y);
  94. if(fx!=fy)
  95. {
  96. f[fy]=fx;
  97. hb(rt[fx],rt[fy],1,n);
  98. }
  99. }
  100. q=read();
  101. while(q--)
  102. {
  103. scanf("%s",c);
  104. int x=read(),y=read();
  105. if(c[0]=='B')
  106. {
  107. int fx=zhao(x),fy=zhao(y);
  108. if(fx!=fy)
  109. {
  110. f[fy]=fx;
  111. hb(rt[fx],rt[fy],1,n);
  112. }
  113. }
  114. else
  115. {
  116. int fx=zhao(x);
  117. if(t[rt[fx]].s<y)
  118. puts("-1");
  119. else
  120. printf("%d\n",rl[ques(rt[fx],1,n,y)]);
  121. }
  122. }
  123. return 0;
  124. }

bzoj 2733: [HNOI2012]永无乡【并查集+权值线段树】的更多相关文章

  1. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...

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

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

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

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

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

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

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

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

  6. bzoj 2733: [HNOI2012]永无乡 离线+主席树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status ...

  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. flex里InputText不能输入中文

    最近做项目都没做任何的更新,今天突然遇到在flex里的InputText无法进行中文输入,晚上查找了下资料,很多原因说是flashplayer的一个BUG. 在网上找到两种解决办法: 1.会出现这种情 ...

  2. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    本文转自:http://mt.sohu.com/20160803/n462486707.shtml 最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论 微服务架构 .近期也看到 ...

  3. struts2常用类型的Result

    2.2.1. dispatcher dispatcher类型是用于转发的Result,可以将请求转发给JSP.这种类型的Result对应的类为 ServletDispatcherResult,它是St ...

  4. POJ 3254 【状态压缩DP】

    题意: 给一块n*m的田地,1代表肥沃,0代表贫瘠. 现在要求在肥沃的土地上种草,要求任何两个草都不能相邻. 问一共有多少种种草的方法. 种0棵草也是其中的一种方法. n和m都不大于12. 思路: 状 ...

  5. UESTC 1087 【二分查找】

    问了某明==shit 中文题意不解释. 因为数据的范围是1e9以内的所以我们可以通过二分的方法枚举可能的中位数. 用二分法每次判断某一数字比中位数大还是比中位数小. 判断方法是,枚举以第n个数为起点的 ...

  6. 关于MSSQL的decimal(numeric)、money、float的使用以及区别

    decimal(numeric).money.float(real) 都是MSSQL中的浮点类型的数据类型. 按存储的范围进行排序 float(real) decimal(numeric) money ...

  7. 【Todo】秒杀系统 & 乐观锁 & Nginx反向代理

    http://www.csdn.net/article/2014-11-28/2822858 1. 单点帐号验证,不用读,而是用写入,Redis,看是否加watch 2. 抢宝的最终购买冲突.包装称“ ...

  8. 学习LaTex

    MarkDown+Latex 本来想学习latex编辑公式的,在博客园内置的MarkDown编辑器已经支持Latex公式解析了,如下: $$x=\frac{-b\pm\sqrt{b^2-4ac}}{2 ...

  9. Please enter a commit message to explain why this merge is necessary.

    Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pul ...

  10. [学习笔记]overthewire bandit 通关秘籍

    1.第一关 使用putty等工具连入linux即可,注意port等设置. ls 列目录内文件: cat readme,显示文件内容,即可看到密码. 2.第二关 如何查看文件名为-的文件? cat ./ ...