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的更多相关文章

  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. Layout两列定宽中间自适应三列布局

    最容易理解的一种方法,以中间内容为主体,通过 margin 或者 padding 将两侧撑开,最后用 absolute 定位两侧 html: <div class="container ...

  2. Brainwashing

    [Brainwashing] 1.教育和媒体都是“国家意识机器”,他们维持并复制国家领导者的思想. 2.洗脑.情感.意识. 3.洗脑所产生的各种影响具有如下特征:全用暴力,或者进行欺骗,或二者兼有. ...

  3. web 浏览器窗口

    1.窗口位置: 取得浏览器窗口左边和上边距屏幕左边和上边的位置 var leftPos = (typeof window.screenLeft == "number")? wind ...

  4. django models实际操作中遇到的一些问题

    问题1.将主键id改成自动生成的python3 manage.py migrate时报下面的错误 django.db.utils.InternalError: (1091, "Can't D ...

  5. MySQL数据类型及使用场景

    MySQL数据类型介绍 整数类型 类型名称 说明 存储需求 取值范围有符号 取值范围符号 TINYINT 很小的整数 1个字节 -128~127 0-255 SMALLINT 小的整数 2个字节 32 ...

  6. 【C++】SGI-STL空间配置器

    第一级配置器是对C的内存分配函数malloc,free,realloc的简单封装,用来分配大于128bytes的区块. 第二级配置器管理16个free-lists链表,各自管理8-128bytes的小 ...

  7. oracle 一致读原理

    在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(Instance Recovery). ...

  8. 我和struts2 的第一天

    文字解析 1.获取正文请求 2.根据请求做出判断 3.执行具体的方法代码 4.跳转页面,展示给用户 Strut 是Apache发行的MVC框架 他只是表现层的框架 Strut1 是2005年流行的框架 ...

  9. docker容器和镜像

    这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docker技术还是一知半解的时候,我 ...

  10. jggrid应用,后台c#

    参考网址: 1.https://www.cnblogs.com/miro/p/jqGrid.html 2.https://blog.csdn.net/ainuser/article/details/6 ...