3123: [Sdoi2013]森林

题意:一个森林,加边,询问路径上k小值。保证任意时刻是森林


LCT没法搞,树上kth肯定要用树上主席树

加边?启发式合并就好了,小的树dfs重建一下

注意

  1. 测试点编号不是数据组数!!!
  2. 加边的时候要更新邻接链表啊,并且fa要清空
  3. 并查集维护size一定初始化1



好了现在我要填报名表了

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. #define lc(x) t[x].l
  8. #define rc(x) t[x].r
  9. const int N=1e5+5, M=2e5+5;
  10. inline int read(){
  11. char c=getchar();int x=0,f=1;
  12. while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
  13. while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
  14. return x*f;
  15. }
  16. int n, m, Q, a[N], u, v, k, mp[N]; char s[5];
  17. namespace ufs{
  18. int fa[N], size[N];
  19. int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
  20. } using ufs::size; using ufs::find;
  21. struct edge{int v,ne;}e[M];
  22. int cnt, h[N];
  23. inline void ins(int u, int v) {
  24. e[++cnt]=(edge){v, h[u]}; h[u]=cnt;
  25. e[++cnt]=(edge){u, h[v]}; h[v]=cnt;
  26. }
  27. int vis[N], fa[N][18], deep[N];
  28. int lca(int x, int y) {
  29. if(deep[x]<deep[y]) swap(x, y);
  30. int bin=deep[x]-deep[y];
  31. for(int i=0; i<17; i++) if((1<<i)&bin) x=fa[x][i];
  32. if(x==y) return x;
  33. for(int i=16; i>=0; i--)
  34. if(fa[x][i] != fa[y][i]) x=fa[x][i], y=fa[y][i];
  35. return fa[x][0];
  36. }
  37. struct ChairTree{
  38. struct meow{int l,r,size;}t[N*85];
  39. int sz, root[N];
  40. void insert(int &x, int l, int r, int p) {
  41. t[++sz]=t[x]; x=sz;
  42. t[x].size++;
  43. if(l==r) return;
  44. int mid=(l+r)>>1;
  45. if(p<=mid) insert(lc(x), l, mid, p);
  46. else insert(rc(x), mid+1, r, p);
  47. }
  48. void build(int u) { //printf("build %d %d\n",u,fa[u][0]);
  49. vis[u]=1;
  50. for(int i=1; (1<<i)<=deep[u]; i++)
  51. fa[u][i] = fa[ fa[u][i-1] ][i-1];
  52. root[u] = root[fa[u][0]];
  53. insert(root[u], 1, *mp, a[u]);
  54. for(int i=h[u];i;i=e[i].ne)
  55. if(e[i].v != fa[u][0]) {
  56. fa[e[i].v][0]=u; deep[e[i].v]=deep[u]+1;
  57. build(e[i].v);
  58. }
  59. }
  60. int query(int u, int v, int k) {
  61. int f=lca(u,v), g=fa[f][0];
  62. int x=root[u], y=root[v], l=1, r=*mp; f=root[f]; g=root[g];
  63. while(l!=r) {
  64. int lsize = t[lc(x)].size + t[lc(y)].size - t[lc(f)].size - t[lc(g)].size;
  65. int mid=(l+r)>>1;
  66. if(k<=lsize) x=lc(x), y=lc(y), f=lc(f), g=lc(g), r=mid;
  67. else x=rc(x), y=rc(y), f=rc(f), g=rc(g), l=mid+1, k-=lsize;
  68. }
  69. return l;
  70. }
  71. void rebuild(int u) {
  72. for(int i=1; i<17; i++)
  73. fa[u][i] = fa[ fa[u][i-1] ][i-1];
  74. root[u] = root[fa[u][0]];
  75. insert(root[u], 1, *mp, a[u]);
  76. for(int i=h[u];i;i=e[i].ne)
  77. if(e[i].v != fa[u][0]) {
  78. fa[e[i].v][0]=u; deep[e[i].v]=deep[u]+1;
  79. rebuild(e[i].v);
  80. }
  81. }
  82. void Link(int u, int v) {
  83. int x=find(u), y=find(v);
  84. if(size[x]<size[y]) swap(x, y), swap(u, v);
  85. ufs::fa[y]=x; size[x]+=size[y];
  86. ins(u, v);
  87. fa[v][0]=u; deep[v]=deep[u]+1;
  88. rebuild(v);
  89. }
  90. }C;
  91. int candy;
  92. int main() {
  93. freopen("in","r",stdin);
  94. int T=read(); T+=2333;
  95. n=read(); m=read(); Q=read();
  96. for(int i=1; i<=n; i++) a[i]=mp[i]=read(), ufs::fa[i]=i, size[i]=1;
  97. sort(mp+1, mp+1+n); mp[0]=unique(mp+1, mp+1+n)-mp-1;
  98. for(int i=1; i<=n; i++) a[i] = lower_bound(mp+1, mp+1+*mp, a[i])-mp;
  99. for(int i=1; i<=m; i++) {
  100. u=read(), v=read();
  101. ins(u,v);
  102. u=find(u); v=find(v);
  103. ufs::fa[v]=u; size[u]+=size[v];
  104. }
  105. for(int i=1; i<=n; i++) if(!vis[i]) C.build(i);
  106. int ans=0;
  107. //candy=1;
  108. for(int i=1; i<=Q; i++) {
  109. scanf("%s",s);
  110. if(candy) u=read(), v=read();
  111. else u=read()^ans, v=read()^ans;
  112. if(s[0]=='Q') {
  113. if(candy) k=read();
  114. else k=read()^ans;
  115. ans = mp[C.query(u, v, k)];
  116. printf("%d\n", ans);
  117. }else C.Link(u, v);
  118. }
  119. }

BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]的更多相关文章

  1. Bzoj 3123: [Sdoi2013]森林(主席树+启发式合并)

    3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 第一行包含一个正整数testcase,表示当前 ...

  2. [bzoj3123] [SDOI2013]森林 主席树+启发式合并+LCT

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  3. [BZOJ3123][Sdoi2013]森林 主席树+启发式合并

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 第一行包含一个正整数testcase,表示当 ...

  4. 【BZOJ 3123】 [Sdoi2013]森林 主席树启发式合并

    我们直接按父子关系建主席树,然后记录倍增方便以后求LCA,同时用并查集维护根节点,而且还要记录根节点对应的size,用来对其启发式合并,然后每当我们合并的时候我们都要暴力拆小的一部分重复以上部分,总时 ...

  5. luoguP3302 [SDOI2013]森林 主席树 启发式合并

    题目链接 luoguP3302 [SDOI2013]森林 题解 本来这题树上主席树暴力启发式合并就完了 结果把lca写错了... 以后再也不这么写了 复杂度\(O(nlog^2n)\) "f ...

  6. [SDOI2013]森林 主席树+启发式合并

    这题的想法真的很妙啊. 看到题的第一眼,我先想到树链剖分,并把\(DFS\)序当成一段区间上主席树.但是会发现在询问的时候,可能会非常复杂,因为你需要把路径拆成很多条轻链和重链,它们还不一定连续,很难 ...

  7. 【BZOJ-3123】森林 主席树 + 启发式合并

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2738  Solved: 806[Submit][Status] ...

  8. bzoj 3123 可持久化线段树启发式合并

    首先没有连边的操作的时候,我们可以用可持久化线段树来维护这棵树的信息,建立权值可持久化线段树,那么每个点继承父节点的线段树,当询问为x,y的时候我们可以询问rot[x]+rot[y]-rot[lca( ...

  9. P3302 [SDOI2013]森林(主席树+启发式合并)

    P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...

随机推荐

  1. 在.Net中将RocketMQ跑起来_入门篇【2】

    上一篇讲了如何再控制台将RocketMQ跑起来,本篇讲解,在asp.net mvc种跑起来,含(发布.订阅). 本次将不挨个贴源码,直接展示目录,根据上一篇文章,进行相应的调整即可. 1.新建一个类库 ...

  2. ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect

    上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与Jwt以及OpenID Connect之间的关系与区别. 本文主要内 ...

  3. [国嵌笔记][020][ARM家族大检阅]

    ARM芯片:2440(arm9) 6410(arm11) 210(cortex-A8) ARM核:arm9(arm-v4) arm11(arm-v6) cortex-A8(arm-v7) 指令架构:a ...

  4. Python数据类型一:数字与运算符

    数字 一.数值类型 python中支持的数值类型有以下几种: 1.整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点.Python3 整型是没有限制大小的,可以当作 Long 类型使 ...

  5. Html5+js测试题【完整版】

    一.闭包的理解:使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露.闭包三个特性: 1.函数嵌套函数 ; 2 ...

  6. Struts 2 标签库及使用

    1  Struts 2 基本的标签属性. 1) name:指定表单元素的名称,该属性与Action中定义的属性相对应. 2) value:指定表单元素的值. 3) required:指定表单元素的必填 ...

  7. CCF系列之I’m stuck!(201312-5)

    试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', ...

  8. SNMP PDU解析

    (注:此文章仅为个人学习,研究,原创作者:Penguinbupt,原创文章网址:http://blog.csdn.net/u010566813/article/details/50490858) SN ...

  9. idea 远程调试 tomcat web应用

    最近在做的一个东西,测试环境和本地环境差距太大,本地能运行的代码,放到测试环境上到处报错,哪里哪里都连不上,所以决定把代码部署到远程服务器上调试,节省时间. 网上看了很多教程,大部分都是互相抄来抄去, ...

  10. 2017-07-06(grep man apropos )

    grep 格式 grep [选项]  字符串  文件名 选项 -i 忽略大小写 -v 排除指定字符串 作用 在文件中查找字符串 例子 grep  "size"  anaconda- ...