裸LCT。。QAQ写了三遍没写对

真是老了。。QAQ

主要错的地方是

init:

size[i] = sum[i] = val[i] = mul[i] = 1;

pushdown:

注意判断左右儿子是否为空

splay:

前面有pushdown, stack..

while(!isroot(p)){

int x = fa[p], y = fa[x];

if(!isroot(x))...

}

Access:

while(u){

...

c[u][] = t;

u = fa[u];
}

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define maxn 100010
  6. using namespace std;
  7.  
  8. typedef long long ll;
  9.  
  10. const int md = 51061;
  11.  
  12. int n, q;
  13. int c[maxn][2], fa[maxn], val[maxn], mul[maxn], add[maxn];
  14. int sum[maxn], top, st[maxn], size[maxn];
  15. bool rev[maxn];
  16. namespace splay{
  17. inline void Mul(int& x, ll y){
  18. x = x * y % md;
  19. }
  20. inline void Add(int& x, ll y){
  21. x = (x + y) % md;
  22. }
  23.  
  24. void init(){
  25. for(int i = 1; i <= n; i ++)
  26. val[i] = mul[i] = 1, add[i] = 0;
  27. }
  28.  
  29. inline void pushup(int x){
  30. sum[x] = (sum[c[x][0]] + sum[c[x][1]] + val[x]) % md;
  31. size[x] = size[c[x][0]] + size[c[x][1]] + 1;
  32. }
  33.  
  34. inline void pushdown(int x){
  35. if(rev[x]){
  36. if(c[x][0])rev[c[x][0]] ^= 1;
  37. if(c[x][1])rev[c[x][1]] ^= 1;
  38. swap(c[x][0], c[x][1]);
  39. rev[x] = 0;
  40. }
  41.  
  42. int lc = c[x][0], rc = c[x][1];
  43. if(lc != 0){
  44. if(mul[x] != 1){
  45. Mul(mul[lc], mul[x]);
  46. Mul(add[lc], mul[x]);
  47. Mul(val[lc], mul[x]);
  48. Mul(sum[lc], mul[x]);
  49. }
  50. if(add[x] != 0){
  51. Add(add[lc], add[x]);
  52. Add(val[lc], add[x]);
  53. Add(sum[lc], (ll)size[lc] * add[x]);
  54. }
  55. }
  56.  
  57. if(rc != 0){
  58. if(mul[x] != 1){
  59. Mul(mul[rc], mul[x]);
  60. Mul(add[rc], mul[x]);
  61. Mul(val[rc], mul[x]);
  62. Mul(sum[rc], mul[x]);
  63. }
  64. if(add[x] != 0){
  65. Add(add[rc], add[x]);
  66. Add(val[rc], add[x]);
  67. Add(sum[rc], (ll)size[rc] * add[x]);
  68. }
  69. }
  70. mul[x] = 1, add[x] = 0;
  71. }
  72.  
  73. inline bool isroot(int x){
  74. return c[fa[x]][0] != x && c[fa[x]][1] != x;
  75. }
  76.  
  77. inline void rotate(int p, int x){
  78. int mark = p == c[x][1], y = c[p][mark^1], z = fa[x];
  79. if(c[z][0] == x) c[z][0] = p;
  80. if(c[z][1] == x) c[z][1] = p;
  81. if(y) fa[y] = x;
  82. c[p][mark^1] = x, fa[p] = z;
  83. c[x][mark] = y, fa[x] = p;
  84. pushup(x);
  85. }
  86.  
  87. inline void splay(int p){
  88. st[top = 1] = p;
  89. for(int i = p; !isroot(i); i = fa[i])
  90. st[++ top] = fa[i];
  91. while(top) pushdown(st[top --]);
  92. while(!isroot(p)){
  93. int x = fa[p], y = fa[x];
  94. if(isroot(x))rotate(p, x);
  95. else if(p == c[x][0] ^ x == c[y][0])
  96. rotate(p, x), rotate(p, y);
  97. else rotate(x, y), rotate(p, x);
  98. }
  99. pushup(p);
  100. }
  101.  
  102. inline void update(int x, int mu, int ad){
  103. if(mu != 1){
  104. Mul(val[x], mu);
  105. Mul(mul[x], mu);
  106. Mul(add[x], mu);
  107. Mul(sum[x], mu);
  108. }
  109.  
  110. if(ad != 0){
  111. Add(val[x], ad);
  112. Add(add[x], ad);
  113. Add(sum[x], (ll)size[x] * ad);
  114. }
  115. }
  116. }
  117.  
  118. namespace LCT{
  119. void Access(int u){
  120. int t = 0;
  121. while(u){
  122. splay::splay(u);
  123. c[u][1] = t;
  124. t = u;
  125. splay::pushup(u);
  126. u = fa[u];
  127. }
  128. }
  129.  
  130. void Evert(int u){
  131. Access(u);
  132. splay::splay(u);
  133. rev[u] ^= 1;
  134. splay::pushdown(u);
  135. }
  136.  
  137. void link(int u, int v){
  138. Evert(u);
  139. fa[u] = v;
  140. //Access(u); splay::splay(u);
  141. }
  142.  
  143. void cut(int u, int v){
  144. Evert(u);
  145. Access(v);
  146. splay::splay(v);
  147. c[v][0] = fa[u] = 0;
  148. splay::pushup(v);
  149. }
  150.  
  151. void update(int u, int v, int mu, int ad){
  152. Evert(u), Access(v);
  153. splay::splay(v);
  154. splay::update(v, mu, ad);
  155. }
  156.  
  157. int ask(int u, int v){
  158. Evert(u), Access(v);
  159. splay::splay(v);
  160. return sum[v];
  161. }
  162. }
  163.  
  164. int main(){
  165. scanf("%d%d", &n, &q);
  166. splay::init();
  167. int u, v, u1, v1, c;
  168. for(int i = 1; i < n; i ++){
  169. scanf("%d%d", &u, &v);
  170. LCT::link(u, v);
  171. }
  172. for(int i = 1; i <= q; i ++){
  173. char ch = getchar();
  174. for(; ch < '!'; ch = getchar());
  175. if(ch == '+'){
  176. scanf("%d%d%d", &u, &v, &c);
  177. LCT::update(u, v, 1, c);
  178. }
  179. if(ch == '-'){
  180. scanf("%d%d%d%d", &u, &v, &u1, &v1);
  181. LCT::cut(u, v);
  182. LCT::link(u1, v1);
  183. }
  184. if(ch == '*'){
  185. scanf("%d%d%d", &u, &v, &c);
  186. LCT::update(u, v, c, 0);
  187. }
  188. if(ch == '/'){
  189. scanf("%d%d", &u, &v);
  190. printf("%d\n", LCT::ask(u, v));
  191. }
  192. }
  193. return 0;
  194. }

[BZOJ 2631]tree的更多相关文章

  1. bzoj 2631: tree 动态树+常数优化

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1716  Solved: 576[Submit][Status] Descrip ...

  2. [BZOJ - 2631] tree 【LCT】

    题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...

  3. BZOJ 2631: tree( LCT )

    LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...

  4. BZOJ 2631: tree [LCT splay区间]

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 3854  Solved: 1292[Submit][Status][Discus ...

  5. BZOJ 2631 tree(动态树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2631 [题目大意] 要求支持链修改,链查询,边断开,连接操作 [题解] 链修改分乘和加 ...

  6. BZOJ 2631 tree 动态树(Link-Cut-Tree)

    题目大意:维护一种树形数据结构.支持下面操作: 1.树上两点之间的点权值+k. 2.删除一条边.添加一条边,保证加边之后还是一棵树. 3.树上两点之间点权值*k. 4.询问树上两点时间点的权值和. 思 ...

  7. BZOJ 2631 Tree ——Link-Cut Tree

    [题目分析] 又一道LCT的题目,LCT只能维护链上的信息. [代码] #include <cstdio> #include <cstring> #include <cs ...

  8. bzoj 2631: tree link-cut-tree

    题目: Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u ...

  9. 洛谷 1501 [国家集训队]Tree II BZOJ 2631 Tree

    [题解] 维护乘法标记和加法标记的LCT #include<cstdio> #include<algorithm> #define Mod (51061) #define N ...

随机推荐

  1. NYOJ 38布线问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=38 布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南阳 ...

  2. java中四种阶乘的计算

    package com.zf.s2;//创建一个包   import java.math.BigInteger;//导入类 import java.util.ArrayList; import jav ...

  3. 《ASP.NET MVC4 WEB编程》学习笔记------Model模型绑定

    本文转载自haiziguo Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对 ...

  4. 如何在命令行下运行kettle的作业(job)和转换(transform)

    pan 是执行转换的. Pan.bat /file C:\test.ktr /logfile c:\log.txt /level Basic kitchen是执行job的. kitchen.bat / ...

  5. Java for LeetCode 053 Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  6. [Android Pro] Android签名与认证详细分析之一(CERT.RSA剖析)

    转载自:http://www.thinksaas.cn/group/topic/335450/ 一.Android签名概述 我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件 ...

  7. php 获取当前时间

    <?php echo $showtime=date("Y-m-d H:i:s");?>

  8. OpenStack Swift集群部署流程与简单使用

    之前介绍了<OpenStack Swift All In One安装部署流程与简单使用>,那么接下来就说一说Swift集群部署吧. 1. 简介 本文档详细描述了使用两台PC部署一个小型Sw ...

  9. ServletContext与ServletConfig的详解及区别

    转自http://hi.baidu.com/huaxuelili/item/1704a03dbb5cd7f22784f4c6 一.ServletContext详解ServletContext是serv ...

  10. J2EE面试题集锦(附答案)

    转自:http://blog.sina.com.cn/s/blog_4e8be0590100fbb8.html J2EE面试题集锦(附答案)一.基础问答 1.下面哪些类可以被继承? java.lang ...