题目链接

luoguP3302 [SDOI2013]森林

题解

本来这题树上主席树暴力启发式合并就完了

结果把lca写错了...

以后再也不这么写了

复杂度\(O(nlog^2n)\)

  1. "for(int i = 0;dad[x][i];++ i) dad[x][i+1] = dad[dad[x][i]][i]"

De了两个多小时....QAQ

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. inline int read() {
  5. int x = 0,f = 1;
  6. char c = getchar();
  7. while(c < '0' || c > '9') {if(c == '-')f = -1;c = getchar(); }
  8. while(c <= '9' && c >= '0')x = x * 10 + c - '0',c = getchar();
  9. return x * f;
  10. }
  11. const int maxn = 100007;
  12. struct NNnode {
  13. int v,next;
  14. } edge[maxn << 2];
  15. int num = 0,head[maxn];
  16. inline void add_edge(int u,int v) {
  17. edge[++ num].v = v; edge[num].next = head[u]; head[u] = num;
  18. }
  19. int root[maxn],val[maxn],n,m,t,MX;
  20. int tot = 0;
  21. int ls[40000000],rs[40000000],cnt[40000000];
  22. void insert(int pre,int &now,int l,int r,int key) {
  23. cnt[++ tot] = cnt[now]; now = tot;
  24. ++ cnt[now];
  25. if(l == r) return ;
  26. int mid = l + r >> 1;
  27. ls[now] = ls[pre]; rs[now] = rs[pre];
  28. if(key <= mid) insert(ls[pre],ls[now],l,mid,key);
  29. else insert(rs[pre],rs[now],mid + 1,r,key);
  30. }
  31. int query(int t1,int t2,int t3,int t4,int l,int r,int k) {
  32. if (l == r) return l;
  33. int mid = l + r >> 1;
  34. int dtl = cnt[ls[t1]] + cnt[ls[t2]] - cnt[ls[t3]] - cnt[ls[t4]];
  35. if(k <= dtl) return query(ls[t1],ls[t2],ls[t3],ls[t4],l,mid,k);
  36. else return query(rs[t1],rs[t2],rs[t3],rs[t4],mid + 1,r,k - dtl);
  37. }
  38. int root_num[maxn],siz[maxn], dep[maxn],dad[maxn][25];
  39. void dfs(int x) {
  40. siz[x] = 1;
  41. for(int i = 1;i < 20;++i)
  42. dad[x][i] = dad[dad[x][i - 1]][i - 1];
  43. insert(root[dad[x][0]],root[x],1,MX,val[x]);
  44. for(int i = head[x];i;i = edge[i].next) {
  45. int v = edge[i].v;
  46. if(v == dad[x][0]) continue;
  47. root_num[v] = root_num[x];
  48. dad[v][0] = x; dep[v] = dep[x] + 1;
  49. dfs(v);
  50. siz[x] += siz[v];
  51. }
  52. }
  53. int LCA(int x,int y) {
  54. if(dep[x] > dep[y]) std::swap(x,y);
  55. for(int i = 19;i >= 0;i --) if(dep[dad[y][i]] >= dep[x]) y = dad[y][i];
  56. if(x == y) return x;
  57. for(int i = 19;i >= 0;i --) if(dad[y][i] != dad[x][i]) y = dad[y][i],x = dad[x][i];
  58. return dad[x][0];
  59. }
  60. int work_q(int x,int y,int k) {
  61. int lca = LCA(x,y);
  62. int F_lca = dad[lca][0];
  63. return query(root[x],root[y],root[lca],root[dad[lca][0]],1,MX,k);
  64. }
  65. void work_L(int x,int y) {
  66. //printf("%d ***** %d\n",x,y);
  67. if(siz[root_num[x]] < siz[root_num[y]]) std::swap(x,y);
  68. dad[y][0] = x;
  69. siz[root_num[x]] += siz[root_num[y]];
  70. root_num[y] = root_num[x];
  71. dep[y] = dep[x] + 1; add_edge(x,y);add_edge(y,x);
  72. dfs(y);
  73. }
  74. int b[maxn];
  75. void solve() {
  76. tot = MX = 0;
  77. n = read(),m = read(); t = read();
  78. for(int i = 1;i <= n;++ i) b[i] = val[i] = read(),MX = std::max(val[i],MX);
  79. std::sort(b + 1,b + n + 1);
  80. int len = std::unique(b + 1,b + n + 1) - b - 1;
  81. for(int i = 1;i <= n;++ i) val[i] = std::lower_bound(b + 1,b + len + 1,val[i]) - b,MX = std::max(val[i],MX);
  82. for(int x,y,i = 1;i <= m;++ i) {
  83. x = read(), y = read();
  84. add_edge(x,y) , add_edge(y,x);
  85. }
  86. for(int i = 1;i <= n;++ i)
  87. if(!root_num[i]) root_num[i] = i,dep[i] = 1,dfs(i);
  88. char opt[20];
  89. int lans = 0;
  90. while(t --) {
  91. scanf("%s",opt + 1) ;
  92. if(opt[1] == 'Q') {
  93. int x = read() ^ lans,y = read() ^ lans, k = read() ^ lans;
  94. //printf("%d **** %d *** %d *** &&&\n",x,y,lans);
  95. printf("%d\n",lans = b[work_q(x,y,k)]);
  96. } else {
  97. int x = read() ,y = read() ;
  98. x ^= lans,y ^= lans;
  99. //printf("%d **** %d *** %d *** ***\n",x,y,lans);
  100. work_L(x,y);
  101. }
  102. }
  103. }
  104. int main() {
  105. int testcase = read(); //whattttt the fucccck?
  106. testcase = 1;
  107. for(int i = 1;i <= testcase;++ i) solve();
  108. }

luoguP3302 [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. BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]

    3123: [Sdoi2013]森林 题意:一个森林,加边,询问路径上k小值.保证任意时刻是森林 LCT没法搞,树上kth肯定要用树上主席树 加边?启发式合并就好了,小的树dfs重建一下 注意 测试点 ...

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

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

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

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

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

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

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

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

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

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

  9. BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并

    BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20 ...

随机推荐

  1. Jenkins与网站代码上线解决方案【转】

    转自 Jenkins与网站代码上线解决方案 - 惨绿少年 https://www.nmtui.com/clsn/lx524.html 1.1 前言 Jenkins是一个用Java编写的开源的持续集成工 ...

  2. python中对列表的所有操作方法

    列表: names = ['a','b','c','d'] 1.追加:names.append() >>> names.append('e') >>> names ...

  3. centos6.5环境disconf管理端安装配置详解

    操作系统:centos6.5 x86_64 安装目录/data 1.安装nginx1.10.1 rpm -ivh http://nginx.org/packages/centos/6/noarch/R ...

  4. zabbix系列(十)zabbix添加对zookeeper集群的监控

    1.应用场景描述 在目前公司的业务中,有部分ESB架构用ZooKeeper作为协同服务的场景,做好ZooKeeper的监控很重要. 2.ZooKeeper监控要点 系统监控 内存使用量    ZooK ...

  5. 转载:编译安装Nginx(1.5.1)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19618.html 1.5 configure详解 可以看出,configure命令至关重要,下文将详细介绍如何使用configure ...

  6. 无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案

    ASP .NET Core MVC 发布到  IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...

  7. poj2279 线性dp

    #include<iostream> #include<cstdio> #include<cstring> #define ll long long using n ...

  8. Fiddler抓包7-post请求(json)

    前言上一篇讲过get请求的参数都在url里,post的请求相对于get请求多了个body部分,本篇就详细讲解下body部分参数的几种形式. 一.body数据类型 常见的post提交数据类型有四种: 1 ...

  9. Redis设置Key/value的规则定义和注意事项(附工具类)

    对于redis的存储key/value键值对,经过多次踩坑之后,我们总结了一套规则:这篇文章主要讲解定义key/value键值对时的定义规则和注意事项. 前面一篇文章讲了如何定义Redis的客户端和D ...

  10. django中,如何把所有models模型文件放在同一个app目录下?

    django的每个app目录下,都有自己的models.py文件. 原则上,每个app涉及的数据库,都会定义在这个文件里. 但是,有的数据库,涉及到多个app应用,不是很方便放在一个单独的app里. ...