就是简单的树链剖分,但标记下传的时候一定要 ^1 而不能直接 = 1,我竟然WA在这么逗比的错误上不如一头撞死……

上代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <iostream>
  5. #include <algorithm>
  6. #define N 1100000
  7. #define inf 0x7f7f7f7f
  8. using namespace std;
  9.  
  10. struct sss
  11. {
  12. int minnum, maxnum;
  13. int push;
  14. }t[N*];
  15. int n, nowplace, bianp[N];
  16. int p[N], next[N*], v[N*], c[N*], bnum;
  17. int fa[N], son[N], siz[N], deep[N], top[N], w[N];
  18.  
  19. void build_tree(int now, int l, int r)
  20. {
  21. t[now].minnum = inf; t[now].maxnum = -inf; t[now].push = ;
  22. if (l == r) return;
  23. int mid = (l+r)/;
  24. build_tree(now*, l, mid); build_tree(now*+, mid+, r);
  25. }
  26.  
  27. void downdate(int now)
  28. {
  29. if (!t[now].push) return; t[now].push = ;
  30. t[now*].push ^= ; t[now*+].push ^= ;
  31. swap(t[now*].maxnum, t[now*].minnum);
  32. swap(t[now*+].maxnum, t[now*+].minnum);
  33. t[now*].maxnum *= -; t[now*].minnum *= -;
  34. t[now*+].maxnum *= -; t[now*+].minnum *= -;
  35. }
  36.  
  37. void update(int now)
  38. {
  39. t[now].maxnum = max(t[now*].maxnum, t[now*+].maxnum);
  40. t[now].minnum = min(t[now*].minnum, t[now*+].minnum);
  41. }
  42.  
  43. void addbian(int x, int y)
  44. {
  45. bnum++; next[bnum] = p[x]; p[x] = bnum; v[bnum] = y;
  46. bnum++; next[bnum] = p[y]; p[y] = bnum; v[bnum] = x;
  47. }
  48.  
  49. void dfs_1(int now, int nowfa, int nowdeep)
  50. {
  51. int k = p[now]; fa[now] = nowfa; deep[now] = nowdeep;
  52. int maxson = ; son[now] = ; siz[now] = ;
  53. while (k)
  54. {
  55. if (v[k] != nowfa)
  56. {
  57. bianp[(k+)/] = v[k];
  58. dfs_1(v[k], now, nowdeep+);
  59. siz[now] += siz[v[k]];
  60. if (siz[v[k]] > maxson)
  61. {
  62. maxson = siz[v[k]];
  63. son[now] = v[k];
  64. }
  65. }
  66. k = next[k];
  67. }
  68. }
  69.  
  70. void dfs_2(int now, int nowfa, int nowtop)
  71. {
  72. int k = p[now]; top[now] = nowtop; w[now] = ++nowplace;
  73. if (son[now]) dfs_2(son[now], now, nowtop);
  74. while (k)
  75. {
  76. if (v[k] != nowfa && v[k] != son[now])
  77. dfs_2(v[k], now, v[k]);
  78. k = next[k];
  79. }
  80. }
  81.  
  82. int task(int now, int l, int r, int al, int ar)
  83. {
  84. if (al <= l && r <= ar) return t[now].maxnum;
  85. int mid = (l+r)/, ans = -inf;
  86. downdate(now);
  87. if (al <= mid) ans = task(now*, l, mid, al, ar);
  88. if (ar > mid) ans = max(ans, task(now*+, mid+, r, al, ar));
  89. update(now); return ans;
  90. }
  91.  
  92. void tneg(int now, int l, int r, int tl, int tr)
  93. {
  94. if (tl <= l && r <= tr)
  95. {
  96. downdate(now);
  97. swap(t[now].maxnum, t[now].minnum);
  98. t[now].maxnum *= -; t[now].minnum *= -;
  99. t[now].push ^= ; return;
  100. }
  101. int mid = (l+r)/;
  102. downdate(now);
  103. if (tl <= mid) tneg(now*, l, mid, tl, tr);
  104. if (tr > mid) tneg(now*+, mid+, r, tl, tr);
  105. update(now); return;
  106. }
  107.  
  108. void chan(int now, int l, int r, int cplace, int cnum)
  109. {
  110. if (l == r)
  111. {
  112. t[now].maxnum = t[now].minnum = cnum;
  113. return;
  114. }
  115. int mid = (l+r)/;
  116. downdate(now);
  117. if (cplace <= mid) chan(now*, l, mid, cplace, cnum);
  118. else chan(now*+, mid+, r, cplace, cnum);
  119. update(now); return;
  120. }
  121.  
  122. void neg(int u, int v)
  123. {
  124. int f1 = top[u], f2 = top[v];
  125. if (deep[f1] < deep[f2]) { swap(f1, f2); swap(u, v); }
  126. if (f1 == f2)
  127. {
  128. if (u == v) return;
  129. if (w[u] > w[v]) swap(u, v);
  130. tneg(, , n, w[son[u]], w[v]);
  131. return;
  132. }
  133. tneg(, , n, w[f1], w[u]); neg(fa[f1], v);
  134. }
  135.  
  136. int find(int u, int v)
  137. {
  138. int f1 = top[u],f2 = top[v];
  139. if (deep[f1] < deep[f2]) { swap(f1, f2); swap(u, v); }
  140. if (f1 == f2)
  141. {
  142. if (u == v) return -inf;
  143. if (w[u] > w[v]) swap(u, v);
  144. return task(, , n, w[son[u]], w[v]);
  145. }
  146. int ans = task(, , n, w[f1], w[u]);
  147. return max(ans, find(fa[f1], v));
  148. }
  149.  
  150. int main()
  151. {
  152. int T; scanf("%d", &T);
  153. while (T--)
  154. {
  155. scanf("%d", &n); memset(p, , sizeof(p));
  156. build_tree(, , n); nowplace = ; bnum = ;
  157. for (int i = ; i < n; ++i)
  158. {
  159. int x, y, z; scanf("%d%d%d", &x, &y, &z);
  160. addbian(x, y); c[i] = z;
  161. }
  162. dfs_1(, , );
  163. dfs_2(, , );
  164. for (int i = ; i < n; ++i)
  165. chan(, , n, w[bianp[i]], c[i]);
  166. char s[];
  167. while (scanf("%s", s) != EOF)
  168. {
  169. if (s[] == 'D') break;
  170. int x, y; scanf("%d%d", &x, &y);
  171. if (s[] == 'Q') printf("%d\n", find(x, y));
  172. else if (s[] == 'C') chan(, , n, w[bianp[x]], y);
  173. else if (s[]=='N') neg(x, y);
  174. }
  175. }
  176. return ;
  177. }

poj 3237 Tree的更多相关文章

  1. poj 3237 Tree [LCA] (树链剖分)

    poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...

  2. poj 3237 Tree(树链拆分)

    题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...

  3. poj 3237 Tree 树链剖分

    题目链接:http://poj.org/problem?id=3237 You are given a tree with N nodes. The tree’s nodes are numbered ...

  4. POJ 3237 Tree (树链剖分 路径剖分 线段树的lazy标记)

    题目链接:http://poj.org/problem?id=3237 一棵有边权的树,有3种操作. 树链剖分+线段树lazy标记.lazy为0表示没更新区间或者区间更新了2的倍数次,1表示为更新,每 ...

  5. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  6. ●POJ 3237 Tree

    题链: http://poj.org/problem?id=3237 题解: LCT 说一说如何完成询问操作就好了(把一条链的边权变成相反数的操作可以类比着来): 首先明确一下,我们把边权下放到点上. ...

  7. POJ 3237 Tree (树链剖分)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 2825   Accepted: 769 Description ...

  8. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12247   Accepted: 3151 Descriptio ...

  9. poj 3237 Tree 树链剖分+线段树

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  10. POJ 3237 Tree 【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一棵树,该树带有边权,现在对该树进行三种操作: 一:改变指定编号边的边权: 二:对树上指定路径的边权全部取反: 三:查询树上指定路径的最大边权值. 解题分析: ...

随机推荐

  1. 04.URL路径访问与模块控制器之间的关系

    <?php //初使化,进行加载. //通过这个英文名来了解,他是定义的与thinkphp有关的核心框架文件目录路径 //他可以通过这一个常量,在以后运行的时候都去找这个路径,确保在运行过程当, ...

  2. android 多语言版本开发

    最近项目中用用到语言切换功能,第一想到的就是资源文件,没错. 在资源文件中新建一个文件夹values-en,en表示英语,有一些还细化到地区,如values-en-rUS 即美国地区的英语,r是必需的 ...

  3. 网络IPC:套接字之寻址

    在学习用套接字做一些有意义的事情之前,需要知道如何确定一个目标通信进程. 进程的标识有两个部分:计算机的网络地址可以帮助标识网络上想与之通信的计算机,而服务可以帮助标识计算机上特定的进程. 1.字节序 ...

  4. bash的for循环从命令读取值

    bash的for循环可以很方便地从命令读取值,还可以指定分割值 下面的程序可以打印文件的内容,前面加上行号 #!/bin/bash # 打印每一行的内容,前面加行号 filename="/h ...

  5. python 实现接口测试

    接口的类型有很多,但是我们经常遇见经常用的就get和post两种.这两种有什么区别呢?个人理解主要是表现在安全性方面. Python代码POST任意的HTTP数据以及使用Cookie的方法,有需要的朋 ...

  6. Web Navigation

    Description Standard web browsers contain features to move backward and forward among the pages rece ...

  7. [JavaEE,MVC] Struts工作原理

    基本概念 Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,它采用MVC模式,能够很好地帮助java 开发者利用J2EE开发Web应用.和其他的java架构一 ...

  8. ie6双边距bug及其解决办法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. find & rm

    1)查找并删除3天前的历史文件 rm -rfi `find /tmp/ -ctime 3` 2)按分钟查找 find -cmin N

  10. 安装Laravel之坎坷记述

    写这篇文章记录以及分享我安装Laravel框架的一些经验 过程如下: 1.按照官方的描述,第一步是先安装composer来管理依赖=>composer下载传送门 下载之后点击安装,按照提示它需要 ...