这道题很简单的连剖+分类讨论,但是SDOI Round2要来了,不会手动栈怎么办呢?只好用一下这道题练习一下手动栈了,结果调了一天多QwQ

链剖的第一个dfs用bfs水过就行,但是我自以为是地把倍增写错了,坑了好久啊QAQ

这道题因为要询问子树,连剖的第二个dfs就不能再用bfs水过了,只能强行手动栈。

一开始拍小数据拍出了好多错,改过来后拍了无数组极限数据也拍不出来,因为构造的极限数据太弱了(偷懒构造u<v)根本无法暴露倍增的漏洞啊!!!

手残错误毁一生,写代码时不要自以为是。希望SD省选能够给我们一个更好的编程环境和评测环境(NOILinux恐怕是奢望吧)

  1. #include<stack>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = 100003;
  7. const int inf = 0x7fffffff;
  8. void read(int &k) {
  9. k = 0; int fh = 1; char c = getchar();
  10. for(; c < '0' || c > '9'; c = getchar())
  11. if (c == '-') fh = -1;
  12. for(; c >= '0' && c <= '9'; c = getchar())
  13. k = (k << 1) + (k << 3) + c - '0';
  14. k = k * fh;
  15. }
  16.  
  17. struct node {int nxt, to;} E[N << 1];
  18. int n, m, point[N], cnt = 0, pos[N], wt[N], deep[N];
  19. int lazy[N * 8], mn[N * 8], top[N], sz[N], f[N][18], root, a[N], son[N];
  20.  
  21. void ins(int x, int y) {E[++cnt] = (node) {point[x], y}; point[x] = cnt;}
  22. stack <int> S;
  23. int qu[N];
  24. void _() {
  25. int p = 0, q = 1; qu[1] = 1;
  26. while (p != q) {
  27. int u = qu[++p];
  28. for(int tmp = point[u]; tmp; tmp = E[tmp].nxt)
  29. if (E[tmp].to != f[u][0])
  30. f[E[tmp].to][0] = u, deep[E[tmp].to] = deep[u] + 1, qu[++q] = E[tmp].to;
  31. }
  32. for(int i = q; i >= 1; --i) {
  33. int u = qu[i], fa = f[u][0];
  34. ++sz[u];
  35. sz[fa] += sz[u];
  36. if (sz[u] > sz[son[fa]]) son[fa] = u;
  37. }
  38. for(int j = 1; j <= 17; ++j)
  39. for(int i = 1; i <= n; ++i)
  40. f[i][j] = f[f[i][j - 1]][j - 1];
  41. }
  42. void __() {
  43. top[1] = 1; cnt = 0;
  44. S.push(1);
  45. while (!S.empty()) {
  46. int u = S.top(); S.pop();
  47. pos[++cnt] = u; wt[u] = cnt;
  48. for(int tmp = point[u]; tmp; tmp = E[tmp].nxt)
  49. if (E[tmp].to != f[u][0] && E[tmp].to != son[u])
  50. top[E[tmp].to] = E[tmp].to, S.push(E[tmp].to);
  51. if (son[u]) {top[son[u]] = top[u]; S.push(son[u]);}
  52. }
  53. }
  54. /* 下面是正确的人工栈模板,完美模拟dfs,但是我学会它不到5小时我就用bfs把它淘汰了
  55. void _() {
  56. S.push(Data(1, point[1]));
  57. sz[1] = 1;
  58. while (!S.empty()) {
  59. int x = S.top().x, y = S.top().y; S.pop();
  60. if (y) {
  61. S.push(Data(x, E[y].nxt));
  62. int v = E[y].to;
  63. if (v != f[x][0]) {
  64. f[v][0] = x;
  65. sz[v] = 1;
  66. deep[v] = deep[x] + 1;
  67. for(int i = 1; i <= 17; ++i) {f[v][i] = f[f[v][i - 1]][i - 1]; if (f[v][i] == 0) break;}
  68. S.push(Data(v, point[v]));
  69. }
  70. } else {
  71. if (!S.empty()) {
  72. sz[S.top().x] += sz[x];
  73. if (sz[x] > sz[son[S.top().x]]) son[S.top().x] = x;
  74. }
  75. }
  76. }
  77. }*/
  78.  
  79. void pushdown(int rt) {
  80. if (lazy[rt]) {
  81. mn[rt << 1] = mn[rt << 1 | 1] = lazy[rt << 1] = lazy[rt << 1 | 1] = lazy[rt];
  82. lazy[rt] = 0;
  83. }
  84. }
  85. void pushup(int rt) {mn[rt] = min(mn[rt << 1], mn[rt << 1 | 1]);}
  86. void Build(int rt, int l, int r) {
  87. if (l == r) {mn[rt] = a[pos[l]]; mn[rt << 1] = mn[rt << 1 | 1] = inf; return;}
  88. int mid = (l + r) >> 1;
  89. Build(rt << 1, l, mid);
  90. Build(rt << 1 | 1, mid + 1, r);
  91. pushup(rt);
  92. }
  93. void add(int rt, int l, int r, int L, int R, int x) {
  94. if (L <= l && r <= R) {lazy[rt] = x; mn[rt] = x; return;}
  95. int mid = (l + r) >> 1;
  96. pushdown(rt);
  97. if (L <= mid) add(rt << 1, l, mid, L, R, x);
  98. if (R > mid) add(rt << 1 | 1, mid + 1, r, L, R, x);
  99. pushup(rt);
  100. }
  101. void Add(int x, int y, int z) {
  102. for(; top[x] != top[y]; x = f[top[x]][0]) {
  103. if (deep[top[x]] < deep[top[y]]) swap(x, y);
  104. add(1, 1, n, wt[top[x]], wt[x], z);
  105. }
  106. if (deep[x] < deep[y]) swap(x, y);
  107. add(1, 1, n, wt[y], wt[x], z);
  108. }
  109. int QQ(int rt, int l, int r, int L, int R) {
  110. if (L <= l && r <= R) return mn[rt];
  111. int mid = (l + r) >> 1, s = inf;
  112. pushdown(rt);
  113. if (L <= mid) s = min(s, QQ(rt << 1, l, mid, L, R));
  114. if (R > mid) s = min(s, QQ(rt << 1 | 1, mid + 1, r, L, R));
  115. return s;
  116. }
  117. int Q(int L, int R) {
  118. if (L > n || R < 1 || L > R) return inf;
  119. return QQ(1, 1, n, L, R);
  120. }
  121.  
  122. int lower;
  123. int LCA(int x, int y) {
  124. if (deep[x] < deep[y]) return 1;
  125. for(int i = 16; i >= 0; --i) if (deep[f[x][i]] > deep[y]) x = f[x][i];
  126. lower = x;
  127. return f[x][0] != y;
  128. }
  129.  
  130. int main() {
  131. read(n); read(m);
  132. int u, v, op, x;
  133. for(int i = 1; i < n; ++i) {
  134. read(u); read(v);
  135. ins(u, v); ins(v, u);
  136. }
  137.  
  138. _();
  139. __();
  140.  
  141. for(int i = 1; i <= n; ++i) read(a[i]);
  142.  
  143. Build(1, 1, n);
  144.  
  145. read(root);
  146. for(int i = 1; i <= m; ++i) {
  147. read(op);
  148. switch (op) {
  149. case 1:
  150. read(root);
  151. break;
  152. case 2:
  153. read(u); read(v); read(x);
  154. Add(u, v, x);
  155. break;
  156. case 3:
  157. read(u);
  158. if (root == u)
  159. printf("%d\n", Q(1, n));
  160. else
  161. if (LCA(root, u)) {
  162. printf("%d\n", Q(wt[u], wt[u] + sz[u] - 1));
  163. } else {
  164. v = min(Q(1, wt[lower] - 1), Q(wt[lower] + sz[lower], n));
  165. printf("%d\n", v);
  166. }
  167. break;
  168. }
  169. }
  170.  
  171. return 0;
  172. }

注释掉了能够完美模拟dfs但并没有什么用的手动栈= =

【BZOJ 3083】遥远的国度的更多相关文章

  1. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  2. BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增

    今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 ...

  3. BZOJ 3083 遥远的国度 树链剖分

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 797  Solved: 181[Submit][Status] Descrip ...

  4. BZOJ 3083 - 遥远的国度

    原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3083 说话间又一个多月过去了..该来除除草了,每天都是训练.没效率,训练.没效率..省选考 ...

  5. bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了…… O( nlog ...

  6. BZOJ 3083 遥远的国度(树链剖分+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3083 [题目大意] 链修改,子树最小值查询和换根操作 [题解] 树链剖分练习题. [代 ...

  7. BZOJ 3083 遥远的国度(树链剖分+LCA)

    Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要z ...

  8. bzoj 3083 遥远的国度 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可. 代码如下: #inclu ...

  9. BZOJ 3083: 遥远的国度(树链剖分+DFS序)

    可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...

  10. BZOJ 3083 遥远的国度 树链剖分+脑子

    唉..又调了半天QWQ..为何读入挂了.....莫非读入是反着的????据ywy学长所言如是...OvO震惊 这啥骚题啊...还要换根...不过清明讲过...(然鹅我现在才做... 先随便选个点(比如 ...

随机推荐

  1. 探索 OpenStack 之(16):计量模块 Ceilometer 介绍及优化

    0. 背景 0.1 为什么要有 Ceilometer? 通常云,特别是公有云在计费方面有三个层次: 计量 (Metering): 收集资源的使用数据,其数据信息主要包括:使用对象(what), 使用者 ...

  2. Golang tips

    1.go test 测试单个函数 go test -v -test.run Test* 2.

  3. 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)

    8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程( ...

  4. Adobe Air移动开发本人体会

    采用FLASH BUILD4.6开发 1.没有mx:Canvas了,s:BordContainer未经手机优化,也不敢用,只有用s:Group 2.好多控件没有了,如DropDownList,Prog ...

  5. Sphinx和coreseek检索引擎

    Sphinx是检索英文用,coreseek是检索中文用. Sphinx(斯芬克斯)是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索 ...

  6. Swift中的Masonry第三方库——SnapKit

    在OC开发时我常用一个名叫Masonry的第三方Autolayout库,在转Swift后发现虽然Swift可以混编OC,但总感觉有些麻烦,在Github上发现了这个叫做SnapKit的第三方库,发现使 ...

  7. TP框架自带的正则验证的规则(转载)

    thinkphp框架里面自带有很多自动验证的规则,下面是框架自带的正则验证的规则,官方的说明文档里面没有这么多,所以记下来,以备使用. view sourceprint?01static $regex ...

  8. .net AES加密解密

    using System;      using System.Collections.Generic;      using System.Text;      using System.Secur ...

  9. MySQL数据库的优化(上)单机MySQL数据库的优化

    MySQL数据库的优化(上)单机MySQL数据库的优化 2011-03-08 08:49 抚琴煮酒 51CTO 字号:T | T 公司网站访问量越来越大,导致MySQL的压力越来越大,让我们自然想到的 ...

  10. K8 系统中省市县数据表的设计可以反映出什么? 通过一个基础业务表的设计品味软件系统的整体架构

    1:没有严谨的Id思想,不变化的Id思想,看不见的Id的思想. 2:数据不严谨,没有上下级关系,没有树形结构,ParentId 的思想. 3:表之间的关系都是弱关联,基础数据一修改业务数据就容易乱套. ...