题目链接:BZOJ - 2631

题目分析

LCT,像线段树区间乘,区间加那样打标记。

这道题我调了一下午。

提交之后TLE了,我一直以为是写错了导致了死循环。

于是一直在排查错误。直到..

直到我看了hzwer的博客,就一句话:“其实这题不需要开long long。。。只要unsigned int,不然可能会T”。

纳尼?!TLE是因为常数问题?于是我将 long long 改成了 unsighed int ,然后...AC。

我................!

long long 不能随便用啊...

代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. inline void Read(int &Num)
  11. {
  12. char c = getchar();
  13. bool Neg = false;
  14. while (c < '0' || c > '9')
  15. {
  16. if (c == '-') Neg = true;
  17. c = getchar();
  18. }
  19. Num = c - '0'; c = getchar();
  20. while (c >= '0' && c <= '9')
  21. {
  22. Num = Num * 10 + c - '0';
  23. c = getchar();
  24. }
  25. if (Neg) Num = -Num;
  26. }
  27.  
  28. const int MaxN = 100000 + 5, Mod = 51061;
  29.  
  30. typedef unsigned int LL;
  31.  
  32. int n, q;
  33. int Father[MaxN], Son[MaxN][2], Size[MaxN];
  34.  
  35. LL T[MaxN], Mul[MaxN], Plus[MaxN], A[MaxN];
  36.  
  37. bool Rev[MaxN], isRoot[MaxN];
  38.  
  39. inline void Update(int x)
  40. {
  41. T[x] = (T[Son[x][0]] + T[Son[x][1]] + A[x]) % Mod;
  42. Size[x] = Size[Son[x][0]] + Size[Son[x][1]] + 1;
  43. }
  44.  
  45. inline void Reverse(int x)
  46. {
  47. Rev[x] = !Rev[x];
  48. swap(Son[x][0], Son[x][1]);
  49. }
  50.  
  51. inline void Paint_Mul(int x, LL Num)
  52. {
  53. Mul[x] = Mul[x] * Num % Mod;
  54. Plus[x] = Plus[x] * Num % Mod;
  55. T[x] = T[x] * Num % Mod;
  56. A[x] = A[x] * Num % Mod;
  57. }
  58.  
  59. inline void Paint_Plus(int x, LL Num)
  60. {
  61. Plus[x] = (Plus[x] + Num) % Mod;
  62. T[x] = (T[x] + Num * Size[x] % Mod) % Mod;
  63. A[x] = (A[x] + Num) % Mod;
  64. }
  65.  
  66. inline void PushDown(int x)
  67. {
  68. if (Rev[x])
  69. {
  70. Rev[x] = false;
  71. if (Son[x][0]) Reverse(Son[x][0]);
  72. if (Son[x][1]) Reverse(Son[x][1]);
  73. }
  74. if (Mul[x] != 1)
  75. {
  76. if (Son[x][0]) Paint_Mul(Son[x][0], Mul[x]);
  77. if (Son[x][1]) Paint_Mul(Son[x][1], Mul[x]);
  78. Mul[x] = 1;
  79. }
  80. if (Plus[x] != 0)
  81. {
  82. if (Son[x][0]) Paint_Plus(Son[x][0], Plus[x]);
  83. if (Son[x][1]) Paint_Plus(Son[x][1], Plus[x]);
  84. Plus[x] = 0;
  85. }
  86. }
  87.  
  88. void Rotate(int x)
  89. {
  90. int y = Father[x], f;
  91. PushDown(y); PushDown(x);
  92. if (x == Son[y][0]) f = 1;
  93. else f = 0;
  94. if (isRoot[y])
  95. {
  96. isRoot[y] = false;
  97. isRoot[x] = true;
  98. }
  99. else
  100. {
  101. if (y == Son[Father[y]][0]) Son[Father[y]][0] = x;
  102. else Son[Father[y]][1] = x;
  103. }
  104. Father[x] = Father[y];
  105. Son[y][f ^ 1] = Son[x][f];
  106. if (Son[x][f]) Father[Son[x][f]] = y;
  107. Son[x][f] = y;
  108. Father[y] = x;
  109. Update(y);
  110. Update(x);
  111. }
  112.  
  113. void Splay(int x)
  114. {
  115. int y;
  116. while (!isRoot[x])
  117. {
  118. y = Father[x];
  119. if (isRoot[y])
  120. {
  121. Rotate(x);
  122. break;
  123. }
  124. if (y == Son[Father[y]][0])
  125. {
  126. if (x == Son[y][0])
  127. {
  128. Rotate(y);
  129. Rotate(x);
  130. }
  131. else
  132. {
  133. Rotate(x);
  134. Rotate(x);
  135. }
  136. }
  137. else
  138. {
  139. if (x == Son[y][1])
  140. {
  141. Rotate(y);
  142. Rotate(x);
  143. }
  144. else
  145. {
  146. Rotate(x);
  147. Rotate(x);
  148. }
  149. }
  150. }
  151. }
  152.  
  153. int Access(int x)
  154. {
  155. int y = 0;
  156. while (x != 0)
  157. {
  158. Splay(x);
  159. PushDown(x);
  160. if (Son[x][1]) isRoot[Son[x][1]] = true;
  161. Son[x][1] = y;
  162. if (y) isRoot[y] = false;
  163. Update(x);
  164. y = x;
  165. x = Father[x];
  166. }
  167. return y;
  168. }
  169.  
  170. void Make_Root(int x)
  171. {
  172. int t = Access(x);
  173. Reverse(t);
  174. }
  175.  
  176. int main()
  177. {
  178. scanf("%d%d", &n, &q);
  179. int a, b;
  180. for (int i = 1; i <= n; ++i)
  181. {
  182. A[i] = T[i] = 1;
  183. Mul[i] = 1; Plus[i] = 0;
  184. isRoot[i] = true;
  185. Size[i] = 1;
  186. }
  187. for (int i = 1; i <= n - 1; ++i)
  188. {
  189. Read(a); Read(b);
  190. Make_Root(a);
  191. Splay(a);
  192. Father[a] = b;
  193. }
  194. char Str[5];
  195. int x, y, Num, t;
  196. for (int i = 1; i <= q; ++i)
  197. {
  198. scanf("%s", Str);
  199. switch (Str[0])
  200. {
  201. case '+' :
  202. Read(x); Read(y); Read(Num);
  203. Make_Root(x);
  204. t = Access(y);
  205. Paint_Plus(t, (LL)Num);
  206. break;
  207.  
  208. case '-' :
  209. Read(x); Read(y);
  210. Make_Root(x);
  211. Access(y);
  212. Splay(y);
  213. PushDown(y);
  214. isRoot[Son[y][0]] = true;
  215. Father[Son[y][0]] = 0;
  216. Son[y][0] = 0;
  217. Update(y);
  218. Read(x); Read(y);
  219. Make_Root(x);
  220. Splay(x);
  221. Father[x] = y;
  222. break;
  223.  
  224. case '*' :
  225. Read(x); Read(y); Read(Num);
  226. Make_Root(x);
  227. t = Access(y);
  228. Paint_Mul(t, (LL)Num);
  229. break;
  230.  
  231. case '/' :
  232. Read(x); Read(y);
  233. Make_Root(x);
  234. t = Access(y);
  235. printf("%d\n", (int)(T[t] % Mod));
  236. break;
  237. }
  238. }
  239. return 0;
  240. }

  

[BZOJ - 2631] tree 【LCT】的更多相关文章

  1. [BZOJ 3282] Tree 【LCT】

    题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...

  2. BZOJ2631 tree 【LCT】

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

  3. 3282. Tree【LCT】

    Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和 ...

  4. bzoj 3159: 决战【LCT】

    只是想复健一下LCT没想到做了不得了的题--调了两天QAQ 题解是这么说的: 但是果然还不太理解--因为swap的前后问题调了好久,(所以一开始养成的习惯后面就不要再改啦-- 总之大概就是把对位置lc ...

  5. BZOJ 1468 Tree 【模板】树上点分治

    #include<cstdio> #include<algorithm> #define N 50010 #define M 500010 #define rg registe ...

  6. 606. Construct String from Binary Tree 【easy】

    606. Construct String from Binary Tree [easy] You need to construct a string consists of parenthesis ...

  7. BZOJ 2631: tree( LCT )

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

  8. [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】

    题目链接:BZOJ - 2049 题目分析 LCT的基本模型,包括 Link ,Cut 操作和判断两个点是否在同一棵树内. Link(x, y) : Make_Root(x); Splay(x); F ...

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

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

随机推荐

  1. Linux学习笔记总结--memcached配置

    Memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到 ...

  2. XC应用系列作品(Android应用)

    XC系列应用,如真题园手机客户端1.1等应用已经分别在 360手机助手.腾讯应用宝.百度手机助手.小米应用商店.豌豆荚.应用汇.木蚂蚁等安卓市场平台上线了! 本页面的系列应用是本人的开发的一Andro ...

  3. json <--->List集合,实体类 之间的相互转换

    json所依赖的jar包http://files.cnblogs.com/files/wenjie123/json_jar%E5%8C%85.rar package com.hp.svse; impo ...

  4. 蓝灯官网下载,蓝灯最新版下载,Lantern(蓝灯)

    蓝灯官网下载,蓝灯最新版下载,Lantern(蓝灯)下载 >>>>>>>>>>>>>>>>>> ...

  5. 使用jquery.validate.js实现boostrap3的校验和验证

    使用jquery.validate.js实现boostrap3的校验和验证 boostrap3验证框架 jquery.validate.js校验表单 >>>>>>& ...

  6. jquery.qrcode和jqprint的联合使用,实现html生成二维码并打印(中文也ok)

    在公司的生产现场中,常常会在一些部品或设备上贴上二维码,用于扫描录入数据,免去手动输入的麻烦. 以前曾经做过winform的程序,生成二维码,并打印出来,使用的是zxing的类库, 但是如果二维码是附 ...

  7. java内存模型及分块

    转自:http://www.cnblogs.com/BangQ/p/4045954.html 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏   1.JMM简介   i.内存模型概述 Ja ...

  8. mybatis中几种typeHandler的定义使用

    1.存储到数据库, 将LONG数组转换成字符串;从数据库获取数据, 将字符串转为LONG数组 package com.winturn.utils.handler; import java.sql.Ca ...

  9. 如何写robots.txt?

    robin 发表在 八月 2, 2006 在国内,网站管理者似乎对robots.txt并没有引起多大重视,应一些朋友之请求,今天想通过这篇文章来简单谈一下robots.txt的写作. robots.t ...

  10. 在Android上模拟登录广工正方教务系统查询成绩

    这是在博客园里开博以来写的第一篇博客. 因为之前看过很多人都有发过关于模拟登录正方软件获取数据的文章,自己觉得挺好玩的便也去动手一做,开始还以为挺难的,但实际做起来还蛮简单的,当然其中还有些小插曲. ...