Luogu1501 Tree II - LCT
Code
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define rd read()
- #define ll long long
- using namespace std;
- const int N = 1e5 + ;
- const int mod = ;
- int n, m;
- int read() {
- int X = , p = ; char c = getchar();
- for (; c > '' || c < ''; c = getchar())
- if (c == '-') p = -;
- for (; c >= '' && c <= ''; c = getchar())
- X = X * + c - '';
- return X * p;
- }
- namespace LCT {
- int ch[N][], tun[N], f[N], size[N];
- ll sum[N], val[N], tim[N], ad[N];
- #define lc(x) ch[x][0]
- #define rc(x) ch[x][1]
- int isroot(int x) {
- return lc(f[x]) != x && rc(f[x]) != x;
- }
- int get(int x) {
- return rc(f[x]) == x;
- }
- void up(int x) {
- sum[x] = val[x];
- size[x] = ;
- if (lc(x)) sum[x] += sum[lc(x)], size[x] += size[lc(x)];
- if (rc(x)) sum[x] += sum[rc(x)], size[x] += size[rc(x)];
- sum[x] %= mod;
- }
- void time(int x, ll d) {
- val[x] = val[x] * d % mod;
- sum[x] = sum[x] * d % mod;
- ad[x] = ad[x] * d % mod;
- tim[x] = tim[x] * d % mod;
- }
- void add(int x, ll d) {
- sum[x] = (sum[x] + d * size[x]) % mod;
- val[x] = (val[x] + d) % mod;
- ad[x] = (ad[x] + d) % mod;
- }
- void rev(int x) {
- swap(lc(x), rc(x));
- tun[x] ^= ;
- }
- void pushdown(int x) {
- if (tim[x] != ) {
- if (lc(x)) time(lc(x), tim[x]);
- if (rc(x)) time(rc(x), tim[x]);
- tim[x] = ;
- }
- if (ad[x]) {
- if (lc(x)) add(lc(x), ad[x]);
- if (rc(x)) add(rc(x), ad[x]);
- ad[x] = ;
- }
- if (tun[x]) {
- if (lc(x)) rev(lc(x));
- if (rc(x)) rev(rc(x));
- tun[x] = ;
- }
- }
- void pd(int x) {
- if (!isroot(x))
- pd(f[x]);
- pushdown(x);
- }
- void rotate(int x) {
- int old = f[x], oldf = f[old], son = ch[x][get(x) ^ ];
- if (!isroot(old)) ch[oldf][get(old)] = x;
- ch[x][get(x) ^ ] = old;
- ch[old][get(x)] = son;
- f[old] = x; f[x] = oldf; f[son] = old;
- up(old); up(x);
- }
- void splay(int x) {
- pd(x);
- for (; !isroot(x); rotate(x))
- if(!isroot(f[x]))
- rotate(get(f[x]) == get(x) ? f[x] : x);
- }
- void access(int x) {
- for (int y = ; x; y = x, x = f[x])
- splay(x), ch[x][] = y, up(x);
- }
- void mroot(int x) {
- access(x); splay(x); rev(x);
- }
- void split(int x, int y) {
- mroot(x); access(y); splay(y);
- }
- void link(int x, int y) {
- mroot(x);
- f[x] = y;
- }
- void cut(int x, int y) {
- split(x, y);
- f[x] = ch[y][] = ;
- up(y);
- }
- }
- using namespace LCT;
- int main()
- {
- n = rd; m = rd;
- for (int i = ; i <= n; ++i)
- size[i] = tim[i] = val[i] = sum[i] = ;
- for (int i = ; i < n; ++i) {
- int u = rd, v = rd;
- link(u, v);
- }
- for (; m; m--) {
- char op[];
- scanf("%s", op);
- if (op[] == '+') {
- int u = rd, v = rd, d = rd;
- split(u, v);
- add(v, d);
- }
- if (op[] == '-') {
- int u = rd, v = rd;
- cut(u, v);
- u = rd; v = rd;
- link(u, v);
- }
- if (op[] == '*') {
- int u = rd, v = rd, d = rd;
- split(u, v);
- time(v, d);
- }
- if (op[] == '/') {
- int u = rd, v = rd;
- split(u, v);
- printf("%lld\n", sum[v] % mod);
- }
- }
- }
Luogu1501 Tree II - LCT的更多相关文章
- 洛谷.1501.[国家集训队]Tree II(LCT)
题目链接 日常zz被define里没取模坑 //标记下放同线段树 注意51061^2 > 2147483647,要开unsigned int //*sz[]别忘了.. #include < ...
- 洛谷P1501 [国家集训队]Tree II(LCT)
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...
- BZOJ 2631 [国家集训队]Tree II (LCT)
题目大意:给你一棵树,让你维护一个数据结构,支持 边的断,连 树链上所有点点权加上某个值 树链上所有点点权乘上某个值 求树链所有点点权和 (辣鸡bzoj又是土豪题,洛谷P1501传送门) LCT裸题, ...
- BZOJ 2631 tree / Luogu P1501 [国家集训队]Tree II (LCT,多重标记)
题意 一棵树,有删边加边,有一条链加/乘一个数,有询问一条链的和 分析 LCT,像线段树一样维护两个标记(再加上翻转标记就是三个),维护size,就行了 CODE #include<bits/s ...
- LUOGU P1501 [国家集训队]Tree II (lct)
传送门 解题思路 \(lct\),比较模板的一道题,路径加和乘的维护标记与线段树\(2\)差不多,然后剩下就没啥了.但调了我将近一下午.. 代码 #include<iostream> #i ...
- P1501 [国家集训队]Tree II LCT
链接 luogu 思路 简单题 代码 #include <bits/stdc++.h> #define ls c[x][0] #define rs c[x][1] using namesp ...
- BZOJ 2631 tree | Luogu P1501 [国家集训队]Tree II (LCT 多重标记下放)
链接:https://www.luogu.org/problemnew/show/P1501 题面: 题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: ...
- P1501 [国家集训队]Tree II(LCT)
P1501 [国家集训队]Tree II 看着维护吧2333333 操作和维护区间加.乘线段树挺像的 进行修改操作时不要忘记吧每个点的点权$v[i]$也处理掉 还有就是$51061^2=2607225 ...
- 【SPOJ10707】 COT2 Count on a tree II
SPOJ10707 COT2 Count on a tree II Solution 我会强制在线版本! Solution戳这里 代码实现 #include<stdio.h> #inclu ...
随机推荐
- SSM商城项目(二)
1. 学习计划 1.将工程改造为基于SOA架构 2.商品列表查询功能实现. 2. 将工程改造为SOA架构 2.1. 分析 由于商城是基于soa的架构,表现层和服务层是不同的工程.所以要实现商品列表查询 ...
- Python 测试
(1)import doctest doctest.testmod(verbose=True) (2) pip install tests
- 1.5.2、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用内部包存储库)
本主题描述如何在Cloudera Manager部署中创建内部包存储库和直接主机以使用该存储库.您可以创建永久或临时存储库. 完成这些步骤后,您可以安装特定版本的Cloudera Manager或在未 ...
- Beef的使用
应用普遍转移到B/S架构,浏览器成为统一客户端程序 通过注入JS脚本,利用浏览器攻击其他网站 ruby编写 攻击手段 利用网站XSS漏洞实现攻击 诱使客户端访问含有hook的伪造站点 结合中间人攻击注 ...
- python使用函数作为参数
在实际使用中,我们有时希望将函数作为参数传递给另一个方法使用. 比如装饰器实际就是函数调用函数 举个例子,我想传递在调用方法之前打印一下时间: 使用函数当做入参 那就可以把方法名A当做入参传递 ...
- java面试题:多线程与并发
多线程 关键词:线程池 Q:如何新建一个线程? 继承Thread,或者实现Runnable接口,或者通过Callable接口实现. Q:Callable怎么用? Callable可以作为FutureT ...
- zabbix监控指定端口
生产上经常会监控某些具体端口状态,下面介绍具体步骤: 主机名 ip 操作系统 zabbix版本 zabbix-server 172.27.9.63 Centos7.3.1611 zabbix_serv ...
- CentOS 7 单用户模式+救援模式
CentOS 7 单用户模式+救援模式 CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导 ...
- 中国剩余定理模板 51nod 1079
题目链接:传送门 推荐博客:https://www.cnblogs.com/freinds/p/6388992.html (证明很好,代码有误). 1079 中国剩余定理 基准时间限制:1 秒 空间 ...
- Driver stacktrace: at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGSchedul
在写Spark程序是遇到问题 Driver stacktrace: at org.apache.spark.scheduler.DAGScheduler.orgapacheapachesparksch ...