Luogu 3690 LCT - 模板
推荐几篇比较好的博客:
FlashHu 的 讲解比较好 : 传送门
Candy 的 代码~ : 传送门
以及神犇Angel_Kitty的 学习笔记: 传送门
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 - 链修改模板
Luogu 3690 LCT - 模板的更多相关文章
- [Luogu 3690]【模板】Link Cut Tree (动态树)
Description 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和. ...
- luogu 3690 【模板】 Link Cut Tree (动态树)
原来的代码有一些问题. 主要是对于不一定存在的边如何去判断,首先要保证在一个splay里,然后保证彼此之间直接联通且x的右儿子是空的 #include<iostream> #include ...
- Luogu 3690 Link Cut Tree
Luogu 3690 Link Cut Tree \(LCT\) 模板题.可以参考讲解和这份码风(个人认为)良好的代码. 注意用 \(set\) 来维护实际图中两点是否有直接连边,否则无脑 \(Lin ...
- LCT模板
之前一直用的LCT模板,因为其实个人对LCT和Splay不是很熟,所以用起来总觉得略略的坑爹,过了一段时间就忘了,但事实上很多裸的LCT要改的东西是不多的,所以今天写了些注释,以后可能套起模板来会得心 ...
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- LCT 模板及套路总结
这一个月貌似已经考了无数次\(LCT\)了..... 保险起见还是来一发总结吧..... A. LCT 模板 \(LCT\) 是由大名鼎鼎的 \(Tarjan\) 老爷发明的. 主要是用来维护树上路径 ...
- Luogu 3371【模板】单源最短路径
Luogu 3371[模板]单源最短路径 第一次写博客用图论题来试一试 接下来是正文部分 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包 ...
- [luogu P3806] 【模板】点分治1
[luogu P3806] [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条 ...
随机推荐
- mysql 拼接字符
Mysql的查询结果行字段拼接,可以用下面两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...
- C++访问二维数组元素
if(*image_in+j*+xsize+i)>=thresh)//xsize图像宽度 image_out是首地址,加上j*行宽就是目标行的首地址,再加上i,就是在此行中的第i个像素,所以整个 ...
- 多线程 ThreadLocal
要了解ThreadLocal,首先搞清楚ThreadLocal 是什么?是用来解决什么问题的? ThreadLocal 是线程的局部变量, 是每一个线程所单独持有的,其他线程不能对其进行访问, 通常是 ...
- vue 学习1
.static{ border-radius:4px; } .active { width: 100px; height: 100px; background: green; } .text-dang ...
- WPF双向绑定
需求: 思想批量保存数据. 思路: 看了一下MVVM.发现只需要实现前台和后台数据的同步即可.也就是前台的文本框内容变化时后台的对象的属性也要变化就可以了. 参考: http://www.cnblog ...
- ftp删除目录和文件,目录下有文件删除提示【550 Remove directory operation failed.】
注意:目录下有文件,直接删除目录会失败,提示550 Remove directory operation failed. 必须先将目录下的文件都删除,才能删除目录 ftp命令行: ftp删除目 ...
- Error:stray '\243' in program
c++ 程序出现 Error:stray '\243' in program 错误 错误情况: 错误原因: 有不标准的 ASCII 字符出现,一般是中英文问题,比如 :or ; , or ,等 ...
- delet[] 和delete
string *stringPtr1 = new string; string *stringPtr2 = new string[100]; …… delete stringPtr1; delete ...
- f5通过vs访问其他站点的源、目的IP问题
通过VIP访问其他站点,则事实上是从服务器访问到其他站点. 如,域名 a.xin.com解析到vip 10.16.100.47(member为10.16.45.71和10.16.45.72)访问192 ...
- ajax中的contendType和dataType知识点梳理
在ajax中有2个参数比较重要,之前一直没有搞清楚,下面我们开始梳理一下 1.contentType字段:这个字段的意思,ajax发送给后端的数据是什么类型 如果在ajax中不指定这个属性,则默认是u ...