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条 ...
随机推荐
- linux mysqlERROR 1045 (28000): linux忘记数据库密码
已验证没问题 #1.停止mysql数据库(确定能停止掉,不然第二部有问题) /etc/init.d/mysqld stop #2.执行如下命令 mysqld_safe --user=mysql - ...
- php优化-》常用到的部分优化
1.循环内部尽可能不要声明变量: 2.在可以用PHP内部字符串操作函数的情况下,尽量不要用正则表达式: 3.foreach效率更高,尽量用foreach代替while和for循环: 4.用单引号替代双 ...
- 虚拟机 安装 CentOS7
初次接触CentOS,最好是在虚拟机中安装: 因为CentOS的安装选项有很多,不理解的情况下千万不要在物理机上尝试: 不然可能出现这种情况:安装好以后,只有黑色的屏幕,只能在里面敲命令:这对于新手来 ...
- 云笔记项目-测试时无法连接MySQL Server
事情起因:用Mac提交云笔记项目到SVN后,使用台式机import SVN上的云笔记代码,发现到了台式机上,进行junit测试时无法连接Mysql数据库服务器,而Mac上是可以的.以下是报警内容和报警 ...
- java 字符串转16进制的方法
方法一: 用java自带的方法 先将字符串转为字符数组,然后用Integer.toHexString方法进行转换. 缺点:中文容易乱码 方法二: 使用apache的包codec中的方法 org.apa ...
- oracle 一致读原理
在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(Instance Recovery). ...
- 调css时候,设置margin-left没有效果
调css时候,如果设置margin-left没有效果,可能是span不是块元素.设置display:block;即可.
- c3p0的几种使用方式(原文地址: https://my.oschina.net/liangtee/blog/101047)
package com.c3p0.test; import java.sql.Connection; import java.sql.SQLException; import java.beans.P ...
- rancher2 挂载ceph-rbd
一-创建ceph-secret.yml文件 RBD的KEY查看 ceph auth list 复制 client.admin 的key 并使用base64加密 创建ceph-secret.yml ku ...
- 全国高校绿色计算大赛 预赛第二阶段(Python)第1关:统计分数的麻烦
挑战任务 “绿盟杯”比赛过后,赛事承办方的各位工作人员们就开始分头统计各个参赛队伍和同学的成绩了.赛事规模很大,有10000个队伍参加.经过工作人员认真负责的统计,本来已经统计好了这一万个队伍的分数和 ...