题解

………………………………………………

我莫不是一个智障吧

我把testdata的编号

当成数据组数读进来

我简直有毒

以为哪里写错了自闭了好久

实际上这题很简单,只要愉悦地开个启发式合并,然后每次暴力修改一个点的根缀主席树和倍增lca数组就行

复杂度\(n \log^2 n\)

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define MAXN 80005
  10. #define eps 1e-10
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef double db;
  15. template<class T>
  16. void read(T &res) {
  17. res = 0;T f = 1;char c = getchar();
  18. while(c < '0' || c > '9') {
  19. if(c == '-') f = -1;
  20. c = getchar();
  21. }
  22. while(c >= '0' && c <= '9') {
  23. res = res * 10 + c - '0';
  24. c = getchar();
  25. }
  26. res *= f;
  27. }
  28. template<class T>
  29. void out(T x) {
  30. if(x < 0) {x = -x;putchar('-');}
  31. if(x >= 10) {
  32. out(x / 10);
  33. }
  34. putchar('0' + x % 10);
  35. }
  36. int N,M,Q;
  37. int val[MAXN],w[MAXN],cnt,fa[MAXN][20],belong[MAXN],siz[MAXN],dep[MAXN];
  38. struct node {
  39. int sum,lc,rc;
  40. }tr[MAXN * 200];
  41. struct Enode {
  42. int to,next;
  43. }E[MAXN * 2];
  44. int Ncnt,rt[MAXN],sumE,head[MAXN];
  45. void add(int u,int v) {
  46. E[++sumE].to = v;
  47. E[sumE].next = head[u];
  48. head[u] = sumE;
  49. }
  50. int getfa(int u) {
  51. return belong[u] == u ? u : belong[u] = getfa(belong[u]);
  52. }
  53. void Insert(const int &x,int &y,int l,int r,int v) {
  54. y = ++Ncnt;
  55. tr[y] = tr[x];
  56. ++tr[y].sum;
  57. if(l == r) return;
  58. int mid = (l + r) >> 1;
  59. if(v <= mid) Insert(tr[x].lc,tr[y].lc,l,mid,v);
  60. else Insert(tr[x].rc,tr[y].rc,mid + 1,r,v);
  61. }
  62. void rebuild(int u,int f) {
  63. dep[u] = dep[f] + 1;
  64. Insert(rt[f],rt[u],1,cnt,w[u]);
  65. fa[u][0] = f;
  66. for(int i = 1 ; i <= 18 ; ++i) {
  67. fa[u][i] = fa[fa[u][i - 1]][i - 1];
  68. }
  69. for(int i = head[u] ; i ; i = E[i].next) {
  70. int v = E[i].to;
  71. if(v != f) rebuild(v,u);
  72. }
  73. }
  74. void Init() {
  75. Ncnt = 0;sumE = 0;
  76. memset(fa,0,sizeof(fa));
  77. memset(rt,0,sizeof(rt));
  78. memset(head,0,sizeof(head));
  79. memset(dep,0,sizeof(dep));
  80. read(N);read(M);read(Q);
  81. for(int i = 1 ; i <= N ; ++i) {
  82. read(w[i]);val[i] = w[i];
  83. }
  84. sort(val + 1,val + N + 1);
  85. cnt = unique(val + 1,val + N + 1) - val - 1;
  86. for(int i = 1 ; i <= N ; ++i) {
  87. w[i] = lower_bound(val + 1,val + cnt + 1,w[i]) - val;
  88. }
  89. for(int i = 1 ; i <= N ; ++i) belong[i] = i,siz[i] = 1;
  90. int u,v;
  91. for(int i = 1 ; i <= M ; ++i) {
  92. read(u);read(v);
  93. add(u,v);add(v,u);
  94. siz[getfa(v)] += siz[getfa(u)];
  95. belong[getfa(u)] = getfa(v);
  96. }
  97. for(int i = 1 ; i <= N ; ++i) {
  98. if(i == belong[i]) rebuild(i,0);
  99. }
  100. }
  101. int lca(int u,int v) {
  102. if(dep[u] < dep[v]) swap(u,v);
  103. int l = 18;
  104. while(dep[u] > dep[v]) {
  105. if(dep[fa[u][l]] >= dep[v]) u = fa[u][l];
  106. --l;
  107. }
  108. if(u == v) return u;
  109. l = 18;
  110. while(fa[u][0] != fa[v][0]) {
  111. if(fa[u][l] != fa[v][l]) {
  112. u = fa[u][l];
  113. v = fa[v][l];
  114. }
  115. --l;
  116. }
  117. return fa[u][0];
  118. }
  119. int Query(int u,int v,int f,int k) {
  120. int L = 1,R = cnt;
  121. int t = w[f];
  122. u = rt[u],v = rt[v],f = rt[f];
  123. while(L < R) {
  124. int mid = (L + R) >> 1;
  125. int s = tr[tr[u].lc].sum - tr[tr[f].lc].sum + tr[tr[v].lc].sum - tr[tr[f].lc].sum;
  126. if(t >= L && t <= mid) ++s;
  127. if(s < k) {
  128. k -= s;
  129. L = mid + 1;
  130. u = tr[u].rc;v = tr[v].rc;f = tr[f].rc;
  131. }
  132. else {
  133. R = mid;
  134. u = tr[u].lc;v = tr[v].lc;f = tr[f].lc;
  135. }
  136. }
  137. return L;
  138. }
  139. void Solve() {
  140. char op[5];int x,y,k;
  141. int lastans = 0;
  142. for(int i = 1 ; i <= Q ; ++i) {
  143. scanf("%s",op + 1);
  144. read(x);read(y);
  145. x ^= lastans;y ^= lastans;
  146. if(op[1] == 'L') {
  147. int p = getfa(x),q = getfa(y);
  148. if(siz[p] > siz[q]) {swap(x,y);swap(p,q);}
  149. belong[p] = q;siz[q] += siz[p];
  150. rebuild(x,y);
  151. add(x,y);add(y,x);
  152. }
  153. else {
  154. read(k);
  155. k ^= lastans;
  156. out(lastans = val[Query(x,y,lca(x,y),k)]);enter;
  157. }
  158. //out(i);enter;
  159. }
  160. }
  161. int main() {
  162. #ifdef ivorysi
  163. freopen("f1.in","r",stdin);
  164. #endif
  165. int T;
  166. read(T);
  167. Init();
  168. Solve();
  169. }

【BZOJ】3123: [Sdoi2013]森林的更多相关文章

  1. BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]

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

  2. bzoj 3123: [Sdoi2013]森林(45分暴力)

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

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

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

  4. ●BZOJ 3123 [Sdoi2013]森林

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3123 题解: 主席树,在线,启发式合并 简单版(只有询问操作):[2588: Spoj 10 ...

  5. BZOJ 3123 [SDOI2013] 森林 - 启发式合并 主席树

    Description 给你一片森林, 支持两个操作: 查询$x$到$y$的$K$大值,  连接两棵树中的两个点 Solution 对每个节点$x$动态开权值线段树, 表示从$x$到根节点路径上权值出 ...

  6. BZOJ 3123 SDOI2013 森林

    首先对于查询操作就是裸的COT QAQ 在树上DFS建出主席树就可以了 对于连接操作,我们发现并没有删除 所以我们可以进行启发式合并,每次将小的树拍扁插入大的树里并重构即可 写完了之后第一个和第二个点 ...

  7. bzoj 3123 [Sdoi2013]森林(主席树,lca,启发式合并)

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

  8. bzoj 3123 [Sdoi2013]森林(主席树+启发式合并+LCA)

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

  9. 3123: [Sdoi2013]森林

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

随机推荐

  1. node.js 笔记

    教程总结笔记: 学习网站:http://www.runoob.com/nodejs/nodejs-install-setup.html Node.js 中文网及安装文件下载: http://nodej ...

  2. 7.SpringBoot 之 Web

    添加资源处理 package org.springframework.boot.autoconfigure.web.servlet. public class WebMvcAutoConfigurat ...

  3. Emacs org-mode导出html出错

    不知道为什么,当org文件中含有#+TITLE:xxx时,导出会报类似下面的错误: Wrong type argument: listp, #("xxx" 0 3 (:parent ...

  4. buildroot构建项目(八)--- u-boot 2017.11 适配开发板修改 5 ---- 系统启动初始化之五

    执行完 board_init_f 后,跳回到 crt0.S中继续执行汇编语言 ldr r0, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp, ...

  5. asp.net EF框架执行原生SQL语句

    1.执行无参数sql: string sql = "select * from IntegralInfo where convert(nvarchar,getdate(),23)='{0}' ...

  6. MySQL指令

    在mysql里:文件夹就是数据库      文件就是表 创建用户: 格式:create user '用户名'@'IP地址' identified by '密码'; 说明:IP地址是用来限制用户只能在哪 ...

  7. pygame设置text和image共同显示

    下面介绍一下如何用pygame将text文本和图片一起绑定到视图 部分重点用不同颜色做了标记,希望对大家有帮助 代码块: %%writefile tranformtouxiang2.py import ...

  8. postman变量的使用和设置

    之前只是使用postman做接口管理——将各个项目使用到的接口分类管理起来,用的时候手动改参数调用.这次项目连着跑三个接口,需要用到前一个接口的参数,还来回切平台,真的很麻烦,所以就搜了一下有什么便利 ...

  9. mongodb系列~ mongodb慢语句(3)

    简介: 关于mongodb慢日志是如何收集 一 mongodb慢日志的开启 1 直接设置参数,不重启服务:db.setProfilingLevel(1) 2 添加启动参数,重启服务:添加profile ...

  10. Netty通信原理

    Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,它极大的简化了TCP和UDP套接字服务器等网络编程. BIO(Blocking IO):每一个请求,一个S ...