永无乡 bzoj-2733 HNOI-2012

题目大意题目链接

注释:略。


想法

它的查询操作非常友善,就是一个联通块内的$k$小值。

故此我们可以考虑每个联通块建一棵权值线段树。

这样的话每次修改采用线段树启发式合并,查询暴力走权值线段树即可。

Code:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define N 100010
  6. using namespace std;
  7. struct Node
  8. {
  9. int ls,rs,size;
  10. Node() {ls=rs=size=0;}
  11. }a[N*50];
  12. int rt[N],fa[N],cnt,val[N],re[N];
  13. int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
  14. int merge(int x,int y)
  15. {
  16. if(!x||!y) return x|y;
  17. a[x].size+=a[y].size;
  18. a[x].ls=merge(a[x].ls,a[y].ls); a[x].rs=merge(a[x].rs,a[y].rs);
  19. return x;
  20. }
  21. int query(int x,int k,int l,int r)
  22. {
  23. if(l==r) return l;
  24. int ls=a[x].ls,rs=a[x].rs;
  25. int mid=(l+r)>>1;
  26. if(k<=a[ls].size) return query(ls,k,l,mid);
  27. else return query(rs,k-a[ls].size,mid+1,r);
  28. }
  29. int build(int x,int l,int r)
  30. {
  31. // printf("%d %d %d\n",x,l,r);
  32. int p=++cnt;
  33. a[p].size=1;
  34. if(l==r) return p;
  35. int mid=(l+r)>>1;
  36. if(x<=mid) a[p].ls=build(x,l,mid);
  37. else a[p].rs=build(x,mid+1,r);
  38. return p;
  39. }
  40. int main()
  41. {
  42. int n,m; cin >> n >> m ; for(int i=1;i<=n;i++) scanf("%d",&val[i]),re[val[i]]=i,fa[i]=i;
  43. for(int i=1;i<=n;i++) rt[i]=build(val[i],1,n);
  44. // for(int i=1;i<=n;i++) cout << rt[i] << " " ; puts("");
  45. for(int x,y,i=1;i<=m;i++)
  46. {
  47. scanf("%d%d",&x,&y); x=find(x); y=find(y);
  48. if(x!=y)
  49. {
  50. rt[x]=merge(rt[x],rt[y]);
  51. fa[y]=x;
  52. }
  53. }
  54. // for(int i=1;i<=n;i++) printf("%d ",find(i)); puts("");
  55. int q; cin >> q ; while(q--)
  56. {
  57. char opt[10]; int x,y; scanf("%s%d%d",opt,&x,&y);
  58. if(opt[0]=='B')
  59. {
  60. x=find(x); y=find(y);
  61. if(x!=y)
  62. {
  63. rt[x]=merge(rt[x],rt[y]); fa[y]=x;
  64. }
  65. }
  66. else
  67. {
  68. x=find(x);
  69. if(y>a[rt[x]].size) puts("-1");
  70. else printf("%d\n",re[query(rt[x],y,1,n)]);
  71. }
  72. }
  73. return 0;
  74. }

小结:这题是别人好几个月之前写的,当时觉得贼高级现在一看原来是sb题.....

[bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并的更多相关文章

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

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

  2. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  3. bzoj2733: [HNOI2012]永无乡(splay)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3778  Solved: 2020 Description 永 ...

  4. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

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

  6. bzoj2733: [HNOI2012]永无乡 线段树合并

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

  7. BZOJ2733: [HNOI2012]永无乡(线段树合并)

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

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

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

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

    传送门 一看到第k大就肯定要想到什么权值线段树,主席树,平衡树之类的 然后就简单了 用并查集判断连通,每个节点建立一颗权值线段树,连通的时候直接合并即可 查询时再二分递归地查找 时间复杂度好像不是很稳 ...

随机推荐

  1. NavigationView的使用

    代码已经分享至github:https://github.com/YanYoJun/NavigationDemo 转载请注明原文链接:http://www.cnblogs.com/yanyojun/p ...

  2. Android SpannableString及字体设置

    import android.content.Context; import android.graphics.Color; import android.text.SpannableString; ...

  3. nginx访问php程序相关配置

    server { listen *:80; charset utf-8; server_name roujiaxiaomowang.wanghaokun.com mowang.crucco.com; ...

  4. [Windows Server 2008] PHP安装Memcached

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Windows ...

  5. vue中的组件传值

    组件关系可以分为父子组件通信.兄弟组件通信.跨级组件通信. 父传子 - props 子传父 - $emit 跨级可以用bus 父子双向 v-model 父链(this.$parent this.$ch ...

  6. JS 水印图片合成实例页面

    CSS代码: .clip { position: absolute; clip: rect(0 0 0 0); } HTML代码: <input type="file" id ...

  7. 趣味ACM题——圣骑士的斩杀

    题目来源于山东省第七届ACM大学生程序设计竞赛(Execution of Paladin) 题目描述 鱼人是炉石里的一支强大种族,在探险者协会里,圣骑士有了一张新牌,叫亡者归来,效果是召唤本轮游戏中7 ...

  8. 「 HDU P4734 」 F(x)

    # 题目大意 对于一个数 $x$,它的每一位数字分别是 $A_{n}A_{n-1}A_{n-2}\cdots A_{2}A_{1}$,定义其权重 $f(x)=\sum_{i=1}^{n}\left(A ...

  9. BZOJ 3144 切糕 最小割

    题意: 一个矩阵,每个格子分配一个数,不同的数字,代价不同,要求相邻格子数字差小等于d 求最小代价. 分析: 我猜肯定有人看题目就想到最小割了,然后一看题面理科否决了自己的这个想法…… 没错,就是最小 ...

  10. 笔试算法题(13):反转链表 & 左旋转字符串

    出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: struct Node { int v; Nod ...