lct裸题

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. typedef long long ll;
  5. int n, m, uu, vv, val[100005], tagm[100005], taga[100005], sum[100005], siz[100005];
  6. int rev[100005], ww, xx, ch[100005][2], fa[100005];
  7. char ss[15];
  8. const int mod=51061;
  9. bool isRoot(int x){
  10. return ch[fa[x]][0]!=x && ch[fa[x]][1]!=x;
  11. }
  12. bool getW(int x){
  13. return ch[fa[x]][1]==x;
  14. }
  15. void pushMul(int x, int k){
  16. sum[x] = (ll)sum[x] * k % mod;
  17. val[x] = (ll)val[x] * k % mod;
  18. tagm[x] = (ll)tagm[x] * k % mod;
  19. taga[x] = (ll)taga[x] * k % mod;
  20. }
  21. void pushAdd(int x, int k){
  22. sum[x] = (sum[x] + (ll)siz[x]*k) % mod;
  23. val[x] = (val[x] + k) % mod;
  24. taga[x] = (taga[x] + k) % mod;
  25. }
  26. void pushDown(int x){
  27. if(tagm[x]!=1){
  28. pushMul(ch[x][0], tagm[x]);
  29. pushMul(ch[x][1], tagm[x]);
  30. tagm[x] = 1;
  31. }
  32. if(tagm[x]){
  33. pushAdd(ch[x][0], taga[x]);
  34. pushAdd(ch[x][1], taga[x]);
  35. taga[x] = 0;
  36. }
  37. if(rev[x]){
  38. swap(ch[x][0], ch[x][1]);
  39. rev[ch[x][0]] ^= 1;
  40. rev[ch[x][1]] ^= 1;
  41. rev[x] = 0;
  42. }
  43. }
  44. void xf(int x){
  45. if(!isRoot(x)) xf(fa[x]);
  46. pushDown(x);
  47. }
  48. void upd(int x){
  49. siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1;
  50. sum[x] = (sum[ch[x][0]] + sum[ch[x][1]] + val[x]) % mod;
  51. }
  52. void rotate(int x){
  53. int old=fa[x], oldf=fa[old], w=getW(x);
  54. if(!isRoot(old)) ch[oldf][ch[oldf][1]==old] = x;
  55. ch[old][w] = ch[x][w^1]; ch[x][w^1] = old;
  56. fa[ch[old][w]] = old; fa[ch[x][w^1]] = x; fa[x] = oldf;
  57. upd(old); upd(x);
  58. }
  59. void splay(int x){
  60. xf(x);
  61. while(!isRoot(x)){
  62. int f=fa[x];
  63. if(!isRoot(f)) rotate(getW(f)==getW(x)?f:x);
  64. rotate(x);
  65. }
  66. }
  67. void access(int x){
  68. int y=0;
  69. while(x){
  70. splay(x);
  71. ch[x][1] = y;
  72. upd(x);
  73. y = x;
  74. x = fa[x];
  75. }
  76. }
  77. void makeRoot(int x){
  78. access(x);
  79. splay(x);
  80. rev[x] ^= 1;
  81. }
  82. void link(int u, int v){
  83. makeRoot(u);
  84. fa[u] = v;
  85. }
  86. void splitLine(int u, int v){
  87. makeRoot(u);
  88. access(v);
  89. splay(v);
  90. }
  91. void cut(int u, int v){
  92. splitLine(u, v);
  93. ch[v][0] = fa[u] = 0;
  94. }
  95. int main(){
  96. cin>>n>>m;
  97. for(int i=1; i<=n; i++)
  98. tagm[i] = val[i] = siz[i] = 1;
  99. for(int i=1; i<n; i++){
  100. scanf("%d %d", &uu, &vv);
  101. link(uu, vv);
  102. }
  103. while(m--){
  104. scanf("%s", ss);
  105. if(ss[0]=='+'){
  106. scanf("%d %d %d", &uu, &vv, &ww);
  107. splitLine(uu, vv);
  108. pushAdd(vv, ww);
  109. }
  110. else if(ss[0]=='-'){
  111. scanf("%d %d %d %d", &uu, &vv, &ww, &xx);
  112. cut(uu, vv);
  113. link(ww, xx);
  114. }
  115. else if(ss[0]=='*'){
  116. scanf("%d %d %d", &uu, &vv, &ww);
  117. splitLine(uu, vv);
  118. pushMul(vv, ww);
  119. }
  120. else{
  121. scanf("%d %d", &uu, &vv);
  122. splitLine(uu, vv);
  123. printf("%d\n", sum[vv]);
  124. }
  125. }
  126. return 0;
  127. }

luogu1501 [国家集训队]Tree II的更多相关文章

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

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

  2. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  3. [国家集训队]Tree II

    嘟嘟嘟 这道题其实还是挺基础的,只不过操作有点多. 区间乘和区间加按线段树的方式想. 那么就先要下放乘标记,再下放加标记.但这两个和反转标记是没有先后顺序的. 对于区间加,sum加的是区间长度\(*\ ...

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

    题目链接 Tree Ⅱ\(=\)[模板]LCT+[模板]线段树2.. 分别维护3个标记,乘的时候要把加法标记也乘上. 还有就是模数的平方刚好爆\(int\),所以开昂赛德\(int\)就可以了. 我把 ...

  5. 【洛谷1501】[国家集训队] Tree II(LCT维护懒惰标记)

    点此看题面 大致题意: 有一棵初始边权全为\(1\)的树,四种操作:将两点间路径边权都加上一个数,删一条边.加一条新边,将两点间路径边权都加上一个数,询问两点间路径权值和. 序列版 这道题有一个序列版 ...

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

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

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

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

  8. 【刷题】洛谷 P1501 [国家集训队]Tree II

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

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

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

随机推荐

  1. ES5数组遍历

    reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. array.reduce(function(total, currentValue, curren ...

  2. SpringBoot 2.x (15):Actuator监控

    Actuator监控:SpringBoot自带的,对生成环境进行监控的系统 使用:既然是监控,那就不能监控一个空项目 这里我使用SpringBoot整合MyBatis的Demo: https://ww ...

  3. AngularJS(六):表单-复选框

    本文也同步发表在我的公众号“我的天空” 复选框 复选框只有两个值:true或者false,因此在AngularJS中,一般都是将复选框的ng-model绑定为一个布尔值属性,通过这两个布尔值来决定其勾 ...

  4. Collection-Iterator-foreach

    一.Collection(java.util) 1.概述:具有相同性质的一类事物的汇聚的整体,称为集合.任何集合都包含三块内容:对外的接口/接口的实现/对集合运算的算法.         java中使 ...

  5. 帝国empirecms去除后台登陆认证码

    打开文件:\e\config\config.php 找到代码 $ecms_config['esafe']['loginauth']='abc'; 把值设为空即可,即改为 $ecms_config['e ...

  6. MySQL表的碎片整理和空间回收小结

    MySQL表碎片化(Table Fragmentation)的原因 关于MySQL中表碎片化(Table Fragmentation)产生的原因,简单总结一下,MySQL Engine不同,碎片化的原 ...

  7. SequenceFile和MapFile

    HDFS和MR主要针对大数据文件来设计,在小文件处理上效率低.解决方法是选择一个容器,将这些小文件包装起来,将整个文件作为一条记录,可以获取更高效率的储存和处理,避免多次打开关闭流耗费计算资源.hdf ...

  8. web端 第一天认识基础

    .NET 分为两大类 一.客户端应用程序   C/S 技术: Winform WPF MFC   MVVM 二.外部端应用程序  B/S(网页端应用程序/WEB端/WEB端应用程序) 目前学的技术是A ...

  9. ssh免密登录配置方法

    方法一 1.#ssh-keygen -t rsa 在客户端生成密钥对 把公钥拷贝给要登录的目标主机, 目标主机上将这个公钥加入到授权列表 #cat id_rsa.pub >> author ...

  10. FreeRTOS笔记

    任务的创建和删除(静态方法) 任务创建后要开启调度器. FreeRTOSConfig.h 1. 改宏 使能静态创建函数. 会出现,有两个函数未定义. Cortex-M中断管理(上) NVIC:嵌套向量 ...