用LCT实现路径加,路径乘,断开及加上一条边(保证是树),查询路径和。

#include <cstdio>
#include <algorithm>
#define l(x) t[x].s[0]
#define r(x) t[x].s[1]
#define f(x) t[x].f
#define lc(x) (r(f(x)) == x)
#define int unsigned int const int N = , p = ;
char op[];
int n,m,x,y,c,tp,q[N];
struct nd {int v,f,s[],sm,sz,mu,ad,rv;}t[N]; bool rt(int x) {return l(f(x)) != x && r(f(x)) != x;}
void cal(int x, int m, int a) {
if(!x) return;
t[x].v = (t[x].v*m+a)%p, t[x].sm = (t[x].sm*m+a*t[x].sz)%p, t[x].mu = t[x].mu*m%p, t[x].ad = (t[x].ad*m+a)%p;
} void pu(int x) {t[x].sm = (t[l(x)].sm+t[r(x)].sm+t[x].v)%p, t[x].sz = (t[l(x)].sz+t[r(x)].sz+)%p;}
void pd(int x) {
if(t[x].rv) t[x].rv = , t[l(x)].rv ^= , t[r(x)].rv ^= , std::swap(l(x),r(x));
if(t[x].mu != || t[x].ad) cal(l(x),t[x].mu,t[x].ad),cal(r(x),t[x].mu,t[x].ad);
t[x].mu = , t[x].ad = ;
}
void rot(int x) {
int y = f(x), z = f(y), xx = r(y)==x;
if(!rt(y)) t[z].s[r(z)==y] = x;
f(x) = z, f(y) = x, f(t[x].s[!xx]) = y;
t[y].s[xx] = t[x].s[!xx], t[x].s[!xx] = y;
pu(y);
}
void sp(int x) {
q[++tp] = x;
for(int i = x; !rt(i); i = f(i)) q[++tp] = f(i);
while(tp) pd(q[tp--]);
for(int y = f(x); !rt(x); rot(x),y=f(x)) if(!rt(y)) {
if(lc(x)^lc(y)) rot(x); else rot(y);
}
pu(x);
} void acs(int x) {for(int y = ; x; x = f(x)) sp(x), r(x) = y, pu(y=x);}
void mkrt(int x) {acs(x), sp(x), t[x].rv ^= ;}
void spli(int x, int y) {mkrt(y), acs(x), sp(x);}
void lk(int x, int y) {mkrt(x), f(x) = y;}
void cut(int x, int y) {mkrt(x), acs(y), sp(y), l(y) = f(x) = , pu(y);} signed main() {
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) t[i].v = t[i].sm = t[i].sz = t[i].mu = ;
for(int i = ; i < n; i++) scanf("%d%d", &x, &y), lk(x,y);
while(m--) {
scanf("%s%d%d", op, &x, &y);
if(op[] == '+') scanf("%d", &c), spli(x,y), cal(x,,c);
else if(op[] == '-') cut(x,y), scanf("%d%d", &x, &y), lk(x,y);
else if(op[] == '*') scanf("%d", &c), spli(x,y), cal(x,c,);
else spli(x,y), printf("%d\n", t[x].sm);
}
return ;
}

LCT模板(BZOJ2631)的更多相关文章

  1. LCT模板

    之前一直用的LCT模板,因为其实个人对LCT和Splay不是很熟,所以用起来总觉得略略的坑爹,过了一段时间就忘了,但事实上很多裸的LCT要改的东西是不多的,所以今天写了些注释,以后可能套起模板来会得心 ...

  2. LCT 模板及套路总结

    这一个月貌似已经考了无数次\(LCT\)了..... 保险起见还是来一发总结吧..... A. LCT 模板 \(LCT\) 是由大名鼎鼎的 \(Tarjan\) 老爷发明的. 主要是用来维护树上路径 ...

  3. [洛谷P1501] [国家集训队]Tree II(LCT模板)

    传送门 这是一道LCT的板子题,说白了就是在LCT上支持线段树2的操作. 所以我只是来存一个板子,并不会讲什么(再说我也不会,只能误人子弟2333). 不过代码里的注释可以参考一下. Code #in ...

  4. LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板

    P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...

  5. BZOJ2002 & LCT模板(分块不会搞)

    题意: 看题. 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿 着一条直线摆上n个装置,每个装置设定初 ...

  6. bzoj2049-洞穴勘测(动态树lct模板题)

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  7. Luogu 3690 LCT - 模板

    推荐几篇比较好的博客: FlashHu 的 讲解比较好 : 传送门 Candy 的 代码~ : 传送门 以及神犇Angel_Kitty的 学习笔记: 传送门 Code V 模板 #include< ...

  8. 【BZOJ2049,2631,3282,1180】LCT模板四连A

    好吧我并不想讲LCT 只是贴4个代码~ [BZOJ2049][Sdoi2008]Cave 洞穴勘测 #include <cstdio> #include <cstring> # ...

  9. BZOJ 1180 / 2843 LCT模板题_双倍经验

    一大早上到机房想先拍一下模板,热热身. 结果....对照着染色敲的 LCT 竟然死活也调不过去(你说我抄都能抄错) 干脆自己重新敲了一遍,10min就敲完了....... 还是要相信自己 Code: ...

随机推荐

  1. 项目Beta冲刺Day3

    项目进展 李明皇 今天解决的进度 完善了程序的运行逻辑(消息提示框等) 明天安排 前后端联动调试 林翔 今天解决的进度 向微信官方申请登录验证session以维护登录态 明天安排 继续完成维护登录态 ...

  2. 构建微服务开发环境8————Hello 微服务

    [内容指引] 1.用IDEA打开微服务项目; 2.更新Maven依赖: 3.IntelliJ IDEA JDK配置; 4.修改代码: 5.运行微服务: 6.将代码变更提交到Github. 经过前面的努 ...

  3. margin-top导致父标签偏移问题

    从一个大神博客中看到这句话: 这个问题发生的原因是根据规范,一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子的上边距会和其内部文档流中的第一个子元素的上边 ...

  4. 【深度学习】深入理解ReLU(Rectifie Linear Units)激活函数

    论文参考:Deep Sparse Rectifier Neural Networks (很有趣的一篇paper) Part 0:传统激活函数.脑神经元激活频率研究.稀疏激活性 0.1  一般激活函数有 ...

  5. sublime的使用技巧

    ctr+shift+d是复制当前行当下一行2.使用Sublime text 3 编写代码是一种享受,使用Sublime text 3 格式化HTML代码,需要安装插件,具体安装步骤如下:1.打开菜单- ...

  6. 我的PCB电路设计(一)

    我的制板规则 过孔大小:14/24mil-(12/22-28/50)  一般过孔没必要太大.如果电流较大可以适当增大过孔,或者多加几个过孔 线宽大小:小信号线8mil,大电流线不等按1A电流30mil ...

  7. CentOS 7 PHP-redis扩展安装,浏览器不显示数据及redis无法储存数据常见问题解决办法

    首先使用php -m 可以查看到自己安装了那些扩展. 1.使用wget下载redis压缩包 wget https://github.com/phpredis/phpredis/archive/deve ...

  8. 源码解析Flask的配置文件

    在flask里,我们常在主文件中定义某些配置,比如: app.debug = True app.secret_key = 'helloworld!!' 实际上,flask中默认可以进行可选的配置项有很 ...

  9. 改变this不要怕!!!

    在之前的学习和工作中,会不必要的涉及到 改变this的指向问题: 脑子里会想到的是 apply, call, bind 这三个 可逆知道他的区别吗? 1. bind区别于 apply和call 是因为 ...

  10. 源码解析flask的路由系统

    源码解析flask的路由系统 当我们新建一个flask项目时,pycharm通常已经为项目定义了一个基本路由 @app.route('/') def hello_world(): return 'He ...