Code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define rd read()
  5. #define ll long long
  6. using namespace std;
  7.  
  8. const int N = 1e5 + ;
  9. const int mod = ;
  10.  
  11. int n, m;
  12.  
  13. int read() {
  14. int X = , p = ; char c = getchar();
  15. for (; c > '' || c < ''; c = getchar())
  16. if (c == '-') p = -;
  17. for (; c >= '' && c <= ''; c = getchar())
  18. X = X * + c - '';
  19. return X * p;
  20. }
  21.  
  22. namespace LCT {
  23. int ch[N][], tun[N], f[N], size[N];
  24. ll sum[N], val[N], tim[N], ad[N];
  25. #define lc(x) ch[x][0]
  26. #define rc(x) ch[x][1]
  27. int isroot(int x) {
  28. return lc(f[x]) != x && rc(f[x]) != x;
  29. }
  30.  
  31. int get(int x) {
  32. return rc(f[x]) == x;
  33. }
  34.  
  35. void up(int x) {
  36. sum[x] = val[x];
  37. size[x] = ;
  38. if (lc(x)) sum[x] += sum[lc(x)], size[x] += size[lc(x)];
  39. if (rc(x)) sum[x] += sum[rc(x)], size[x] += size[rc(x)];
  40. sum[x] %= mod;
  41. }
  42.  
  43. void time(int x, ll d) {
  44. val[x] = val[x] * d % mod;
  45. sum[x] = sum[x] * d % mod;
  46. ad[x] = ad[x] * d % mod;
  47. tim[x] = tim[x] * d % mod;
  48. }
  49.  
  50. void add(int x, ll d) {
  51. sum[x] = (sum[x] + d * size[x]) % mod;
  52. val[x] = (val[x] + d) % mod;
  53. ad[x] = (ad[x] + d) % mod;
  54. }
  55.  
  56. void rev(int x) {
  57. swap(lc(x), rc(x));
  58. tun[x] ^= ;
  59. }
  60.  
  61. void pushdown(int x) {
  62. if (tim[x] != ) {
  63. if (lc(x)) time(lc(x), tim[x]);
  64. if (rc(x)) time(rc(x), tim[x]);
  65. tim[x] = ;
  66. }
  67. if (ad[x]) {
  68. if (lc(x)) add(lc(x), ad[x]);
  69. if (rc(x)) add(rc(x), ad[x]);
  70. ad[x] = ;
  71. }
  72. if (tun[x]) {
  73. if (lc(x)) rev(lc(x));
  74. if (rc(x)) rev(rc(x));
  75. tun[x] = ;
  76. }
  77. }
  78.  
  79. void pd(int x) {
  80. if (!isroot(x))
  81. pd(f[x]);
  82. pushdown(x);
  83. }
  84.  
  85. void rotate(int x) {
  86. int old = f[x], oldf = f[old], son = ch[x][get(x) ^ ];
  87. if (!isroot(old)) ch[oldf][get(old)] = x;
  88. ch[x][get(x) ^ ] = old;
  89. ch[old][get(x)] = son;
  90. f[old] = x; f[x] = oldf; f[son] = old;
  91. up(old); up(x);
  92. }
  93.  
  94. void splay(int x) {
  95. pd(x);
  96. for (; !isroot(x); rotate(x))
  97. if(!isroot(f[x]))
  98. rotate(get(f[x]) == get(x) ? f[x] : x);
  99. }
  100.  
  101. void access(int x) {
  102. for (int y = ; x; y = x, x = f[x])
  103. splay(x), ch[x][] = y, up(x);
  104. }
  105.  
  106. void mroot(int x) {
  107. access(x); splay(x); rev(x);
  108. }
  109.  
  110. void split(int x, int y) {
  111. mroot(x); access(y); splay(y);
  112. }
  113.  
  114. void link(int x, int y) {
  115. mroot(x);
  116. f[x] = y;
  117. }
  118.  
  119. void cut(int x, int y) {
  120. split(x, y);
  121. f[x] = ch[y][] = ;
  122. up(y);
  123. }
  124. }
  125. using namespace LCT;
  126.  
  127. int main()
  128. {
  129. n = rd; m = rd;
  130. for (int i = ; i <= n; ++i)
  131. size[i] = tim[i] = val[i] = sum[i] = ;
  132. for (int i = ; i < n; ++i) {
  133. int u = rd, v = rd;
  134. link(u, v);
  135. }
  136. for (; m; m--) {
  137. char op[];
  138. scanf("%s", op);
  139. if (op[] == '+') {
  140. int u = rd, v = rd, d = rd;
  141. split(u, v);
  142. add(v, d);
  143. }
  144. if (op[] == '-') {
  145. int u = rd, v = rd;
  146. cut(u, v);
  147. u = rd; v = rd;
  148. link(u, v);
  149. }
  150. if (op[] == '*') {
  151. int u = rd, v = rd, d = rd;
  152. split(u, v);
  153. time(v, d);
  154. }
  155. if (op[] == '/') {
  156. int u = rd, v = rd;
  157. split(u, v);
  158. printf("%lld\n", sum[v] % mod);
  159. }
  160. }
  161. }

Luogu1501 Tree II - LCT的更多相关文章

  1. 洛谷.1501.[国家集训队]Tree II(LCT)

    题目链接 日常zz被define里没取模坑 //标记下放同线段树 注意51061^2 > 2147483647,要开unsigned int //*sz[]别忘了.. #include < ...

  2. 洛谷P1501 [国家集训队]Tree II(LCT)

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

  3. BZOJ 2631 [国家集训队]Tree II (LCT)

    题目大意:给你一棵树,让你维护一个数据结构,支持 边的断,连 树链上所有点点权加上某个值 树链上所有点点权乘上某个值 求树链所有点点权和 (辣鸡bzoj又是土豪题,洛谷P1501传送门) LCT裸题, ...

  4. BZOJ 2631 tree / Luogu P1501 [国家集训队]Tree II (LCT,多重标记)

    题意 一棵树,有删边加边,有一条链加/乘一个数,有询问一条链的和 分析 LCT,像线段树一样维护两个标记(再加上翻转标记就是三个),维护size,就行了 CODE #include<bits/s ...

  5. LUOGU P1501 [国家集训队]Tree II (lct)

    传送门 解题思路 \(lct\),比较模板的一道题,路径加和乘的维护标记与线段树\(2\)差不多,然后剩下就没啥了.但调了我将近一下午.. 代码 #include<iostream> #i ...

  6. P1501 [国家集训队]Tree II LCT

    链接 luogu 思路 简单题 代码 #include <bits/stdc++.h> #define ls c[x][0] #define rs c[x][1] using namesp ...

  7. BZOJ 2631 tree | Luogu P1501 [国家集训队]Tree II (LCT 多重标记下放)

    链接:https://www.luogu.org/problemnew/show/P1501 题面: 题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: ...

  8. P1501 [国家集训队]Tree II(LCT)

    P1501 [国家集训队]Tree II 看着维护吧2333333 操作和维护区间加.乘线段树挺像的 进行修改操作时不要忘记吧每个点的点权$v[i]$也处理掉 还有就是$51061^2=2607225 ...

  9. 【SPOJ10707】 COT2 Count on a tree II

    SPOJ10707 COT2 Count on a tree II Solution 我会强制在线版本! Solution戳这里 代码实现 #include<stdio.h> #inclu ...

随机推荐

  1. SSM商城项目(二)

    1. 学习计划 1.将工程改造为基于SOA架构 2.商品列表查询功能实现. 2. 将工程改造为SOA架构 2.1. 分析 由于商城是基于soa的架构,表现层和服务层是不同的工程.所以要实现商品列表查询 ...

  2. Python 测试

    (1)import doctest doctest.testmod(verbose=True) (2) pip install tests

  3. 1.5.2、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用内部包存储库)

    本主题描述如何在Cloudera Manager部署中创建内部包存储库和直接主机以使用该存储库.您可以创建永久或临时存储库. 完成这些步骤后,您可以安装特定版本的Cloudera Manager或在未 ...

  4. Beef的使用

    应用普遍转移到B/S架构,浏览器成为统一客户端程序 通过注入JS脚本,利用浏览器攻击其他网站 ruby编写 攻击手段 利用网站XSS漏洞实现攻击 诱使客户端访问含有hook的伪造站点 结合中间人攻击注 ...

  5. python使用函数作为参数

    在实际使用中,我们有时希望将函数作为参数传递给另一个方法使用. 比如装饰器实际就是函数调用函数   举个例子,我想传递在调用方法之前打印一下时间:   使用函数当做入参 那就可以把方法名A当做入参传递 ...

  6. java面试题:多线程与并发

    多线程 关键词:线程池 Q:如何新建一个线程? 继承Thread,或者实现Runnable接口,或者通过Callable接口实现. Q:Callable怎么用? Callable可以作为FutureT ...

  7. zabbix监控指定端口

    生产上经常会监控某些具体端口状态,下面介绍具体步骤: 主机名 ip 操作系统 zabbix版本 zabbix-server 172.27.9.63 Centos7.3.1611 zabbix_serv ...

  8. CentOS 7 单用户模式+救援模式

    CentOS 7 单用户模式+救援模式 CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导 ...

  9. 中国剩余定理模板 51nod 1079

    题目链接:传送门 推荐博客:https://www.cnblogs.com/freinds/p/6388992.html (证明很好,代码有误). 1079 中国剩余定理  基准时间限制:1 秒 空间 ...

  10. Driver stacktrace: at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGSchedul

    在写Spark程序是遇到问题 Driver stacktrace: at org.apache.spark.scheduler.DAGScheduler.orgapacheapachesparksch ...