当前位置: 首页 > news >正文

P1501 [国家集训队] Tree II

P1501 [国家集训队] Tree II

大意

动态维护树上的乘积和加和。

思路

直接 \(\text{LCT}\) 维护即可,但是注意乘法和加法的混合的下传。

代码

#include<iostream>
using namespace std;#define uint unsigned int
#define lc(x) t[x].ch[0]
#define rc(x) t[x].ch[1]
#define fa(x) t[x].fa
const int MAXN = 1e5 + 5;
const int MOD = 51061;struct node{int ch[2], fa;uint val, sum, sz, add, mul;bool tag;node(){ch[1] = ch[0] = fa = 0;val = sum = sz = add = 0;mul = 1;tag = false;}
}t[MAXN];bool isroot(int x){return (lc(fa(x)) != x) && (rc(fa(x)) != x);
}void pushup(int x){t[x].sz = t[lc(x)].sz + t[rc(x)].sz + 1;t[x].sum = (t[lc(x)].sum + t[rc(x)].sum + t[x].val) % MOD;
}void update_rev(int x){if(!x) return;swap(lc(x), rc(x));t[x].tag ^= 1;
}void apply(int x, uint md, uint ad){if(!x) return;t[x].val = (1LL * t[x].val * md + ad) % MOD;t[x].sum = (1LL * t[x].sum * md + 1LL * ad * t[x].sz) % MOD;t[x].mul = (1LL * t[x].mul * md) % MOD;t[x].add = (1LL * t[x].add * md + ad) % MOD;
}void pushdown(int x){if(t[x].tag){update_rev(lc(x));update_rev(rc(x));t[x].tag = 0;}if(t[x].mul != 1 || t[x].add != 0){apply(lc(x), t[x].mul, t[x].add);apply(rc(x), t[x].mul, t[x].add);t[x].mul = 1, t[x].add = 0;}
}void rotate(int x){int y = fa(x), z = fa(y);int k = (rc(y) == x);if(!isroot(y)){t[z].ch[rc(z) == y] = x;}fa(x) = z;t[y].ch[k] = t[x].ch[k ^ 1];if(t[x].ch[k ^ 1]){fa(t[x].ch[k ^ 1]) = y;}t[x].ch[k ^ 1] = y;fa(y) = x;pushup(y);pushup(x);
}void pushshell(int x){if(!isroot(x)){pushshell(fa(x));}pushdown(x);
}void splay(int x){pushshell(x);while(!isroot(x)){int y = fa(x), z = fa(y);if(!isroot(y)){(rc(z) == y) ^ (rc(y) == x) ? rotate(x) : rotate(y);}rotate(x);}
}void access(int x){for(int y = 0;x;y = x, x = fa(x)){splay(x);rc(x) = y;pushup(x);}
}void makeroot(int x){access(x);splay(x);update_rev(x);
}int findrt(int x){access(x);splay(x);while(lc(x)){pushdown(x);x = lc(x);}splay(x);return x;
}void split(int x, int y){makeroot(x);access(y);splay(y);
}void link(int x, int y){makeroot(x);if(findrt(y) != x) fa(x) = y;
}void cut(int u1, int v1){split(u1, v1);if(lc(v1) == u1 && rc(u1) == 0){fa(u1) = lc(v1) = 0;pushup(v1);}
}int main(){int n, q;cin >> n >> q;for(int i = 1;i <= n;i ++){t[i].val = t[i].sum = t[i].sz = 1;t[i].mul = 1;}for(int i = 1;i < n;i ++){int u, v; cin >> u >> v;link(u, v);}while(q --){char op; cin >> op;int u, v, u2, v2; uint c;if(op == '+'){cin >> u >> v >> c;split(u, v);apply(v, 1, c);}else if(op == '-'){cin >> u >> v >> u2 >> v2;cut(u, v);link(u2, v2);}else if(op == '*'){cin >> u >> v >> c;split(u, v);apply(v, c, 0);}else if(op == '/'){cin >> u >> v;split(u, v);cout << t[v].sum << endl;}}return 0;
}
http://www.jsqmd.com/news/396655/

相关文章:

  • 拖延症福音!自考论文神器 —— 千笔AI
  • 专科生收藏!倍受青睐的AI论文工具 —— 千笔写作工具
  • Python基于flask的企业项目管任务分配中的应用-vue
  • Python基于flask的医学电子技术线上翻转微课堂作业提交系统
  • Python基于flask框架 体育用品网上商城购物系统
  • 双馈风力电机发电系统【DFIG2.5kW】 本仿真为双馈风力发电机系统。 首先,分析了风力机模...
  • Python基于flask的企业员工人事档案管理系统的设计与实现前台功能多 简历 面试 转正
  • 2.20
  • Python基于flask框架-航空遥感图片影像共享系统-Pycharm django
  • JSON 与 BSON 深度解析:理解 MongoDB 底层数据格式与扩展类型。
  • 实测才敢推!千笔,研究生论文写作神器
  • Python基于flask框架公司服装生产管理信息系统设计与实现-Pycharm django
  • 探索PQ并网功率控制下MMC模块化多电平换流器的奇妙世界
  • Python基于flask框架 小区停车场管理系统-Pycharm django
  • Python基于flask的社区爱心扶贫捐赠系统_j6871jzn
  • Claude Code编程经验记录总结-增量需求开发
  • Python基于flask的高校学术交流平台
  • 用过才敢说 一键生成论文工具 千笔ai写作 VS 锐智 AI 更适合本科生!
  • Java高频面试题:抽象类和接口有什么区别?
  • 改稿速度拉满!AI论文工具 千笔 VS 云笔AI,专为本科生设计!
  • 测完这批工具 8个降AI率软件降AIGC网站 本科生必看!深度测评与推荐
  • 警惕京东e卡回收陷阱,守护闲置资源安全 - 京顺回收
  • 算法祛魅:从快速排序到Transformer
  • Lua编程 —— 小丑牌代码居然是“开源”的!| Balatro | 开源 | MOD制作 | 二创游戏
  • 少走弯路:降AIGC工具 千笔·降AIGC助手 VS WPS AI MBA专属推荐
  • SageMaker分布式训练引擎技术揭秘
  • 从此告别拖延,AI论文软件 千笔·专业论文写作工具 VS 文途AI,专科生专属利器!
  • Katalon Studio 执行日志与测试报告
  • 探索利用光子晶体实现空气有毒物质浓度检测
  • 探索单相桥式全控整流电路(带阻感负载):MATLAB 与 PCB 的奇妙之旅