题面

没有权限号的可以去LOJ

Sol

大家都知道,\(LCT\)上有许多实边和虚边
实边就是每棵\(Splay\)上的既认父亲又认儿子的边
虚边就是\(Splay\)和\(Splay\)之间只认父亲的的边
那么每个点就有它的虚儿子和实儿子,实际上虚儿子才是它在\(LCT\)维护的树上的真正的儿子
当你\(Access(x)\)时,\(x\)的虚儿子加上它自己就是它子树的信息
所以我们要维护每个点虚儿子的信息和LCT子树的信息(也就是虚儿子+实儿子+自己)
怎么维护?
你会发现这只会在\(Access\)和\(Link\)操作中改变
\(Access\)时,这个点的实儿子和虚儿子会有改变,那么维护的虚儿子的信息就减去原来的加上现在的就好了
\(Link\)时,这个点多了一个虚儿子,直接加上就好,但是这个点的祖先都要更改,不好操作,直接把它也\(Makeroot\)就好
LCT子树的信息可以直接写在\(Update\)内

然后这个题就是水题了

询问就是两边\(size\)的乘积

# include <bits/stdc++.h>
# define IL inline
# define RG register
# define ls ch[0][x]
# define rs ch[1][x]
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(1e5 + 10);IL ll Read(){RG char c = getchar(); RG ll x = 0, z = 1;for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x * z;
}int n, Q, ch[2][_], fa[_], size[_], sum[_], rev[_], S[_];IL bool Son(RG int x){  return ch[1][fa[x]] == x;  }IL bool Isroot(RG int x){  return ch[0][fa[x]] != x && ch[1][fa[x]] != x;  }IL void Reverse(RG int x){  if(!x) return; swap(ls, rs); rev[x] ^= 1;  }IL void Update(RG int x){  sum[x] = sum[ls] + sum[rs] + size[x] + 1;  }IL void Pushdown(RG int x){  if(!rev[x]) return; Reverse(ls); Reverse(rs); rev[x] = 0;  }IL void Rotate(RG int x){RG int y = fa[x], z = fa[y], c = Son(x);if(!Isroot(y)) ch[Son(y)][z] = x; fa[x] = z;ch[c][y] = ch[!c][x]; fa[ch[c][y]] = y;ch[!c][x] = y; fa[y] = x; Update(y);
}IL void Splay(RG int x){S[S[0] = 1] = x;for(RG int y = x; !Isroot(y); y = fa[y]) S[++S[0]] = fa[y];while(S[0]) Pushdown(S[S[0]--]);for(RG int y = fa[x]; !Isroot(x); Rotate(x), y = fa[x])if(!Isroot(y)) Son(x) ^ Son(y) ? Rotate(x) : Rotate(y);Update(x);
}IL void Access(RG int x){for(RG int y = 0; x; y = x, x = fa[x]) Splay(x), size[x] += sum[ch[1][x]] - sum[y], ch[1][x] = y, Update(x);
}IL void Makeroot(RG int x){  Access(x); Splay(x); Reverse(x);  }IL void Link(RG int x, RG int y){  Makeroot(x); Makeroot(y); fa[x] = y; size[y] += sum[x]; Update(y);  }IL void Split(RG int x, RG int y){  Makeroot(x); Access(y); Splay(y);  }int main(RG int argc, RG char* argv[]){n = Read(); Q = Read();while(Q--){RG char op; scanf(" %c", &op); RG int x = Read(), y = Read();if(op == 'A') Link(x, y);else Split(x, y), printf("%lld\n", 1LL * sum[x] * (sum[y] - sum[x]));}return 0;
}

转载于:https://www.cnblogs.com/cjoieryl/p/8329269.html

LCT维护子树信息(BZOJ4530:[BJOI2014]大融合)相关推荐

  1. [BZOJ4530][Bjoi2014]大融合 LCT + 启发式合并

    [BZOJ4530][Bjoi2014]大融合 试题描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是 ...

  2. 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息

    题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...

  3. bzoj 4530 [Bjoi2014]大融合——LCT维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530 LCT维护子树 siz .设 sm[ ] 表示轻儿子的 siz 和+1(1是自己的si ...

  4. BZOJ 4530 大融合 LCT维护子树信息

    题意: N<=1e5个点,Q<=1e5个操作. 支持加一条边(u,v)(保证图是森林).询问经过边(u,v)的简单路径条数(保证(u,v)存在). 分析: 数据结构学傻了的我,表示并不会用 ...

  5. BZOJ4530:[BJOI2014]大融合

    Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...

  6. [Bjoi2014]大融合

    [Bjoi2014]大融合 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 394  Solved: 244 [Submit][Status][Dis ...

  7. BZOJ 3639: Query on a tree VII LCT_set维护子树信息

    用 set 维护子树信息,细节较多. Code: #include <cstring> #include <cstdio> #include <algorithm> ...

  8. bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了-- O( nlog ...

  9. 洛谷P4219 大融合(LCT、虚子树)

    解析 本题需要用LCT维护子树大小 然后我就不会了 然后我就用树剖水过去了 又快又好写,真香 现在详细聊聊如何用LCT维护子树信息 每个结点再定义一个新的变量记录所有虚儿子的信息 然后-完了? 告别盲 ...

最新文章

  1. TensorFlow常用Python扩展包
  2. 技术宝典 | WebRTC ADM 源码流程分析
  3. ecmall支持php5.3,在PHP5.3以上版本运行ecshop和ecmall出现的问题及解决方案
  4. php-cli下载,php-cli-color
  5. 论文浅尝 | Understanding Black-box Predictions via Influence Func
  6. 游戏机制新设计工具(Machinations)工作原理
  7. redis bitmap存储入门
  8. 【CSS系列】获取实时数据做进度
  9. 外卖点餐系统源码|餐饮点餐源码开发
  10. Java PC端微信、支付宝扫码支付(一)
  11. 中国大学MOOCPython语言程序设计基础学习笔记和课后练习5-6周(南京邮电大学)
  12. 萤石云摄像头方向操控前端代码
  13. 基于VGGFace2的人脸性别年龄检测系统(源码&教程)
  14. 【操作指导 | 代码实现】挑战程序设计竞赛2:算法和数据结构
  15. 第一讲:云计算的概念
  16. 三菱PLC第一篇:GXWORK3与三菱FX5UPLC同通过交换机连接
  17. RTP打包发送H264(下)
  18. 淘宝API接口开发系列,详情接口参数说明
  19. Spring Initializr私服搭建和定制化模板
  20. 【Dart 教程系列第 28 篇】Dart中的 Map 和实体类的相互转换

热门文章

  1. 不同平台上安装python的方式是一样的对还是错_不可以在同一台计算机上安装多个不同的Python版本...
  2. 自己建服务器 语音盒子_如何自己搭建一个服务器?
  3. 套接字没有连接并且没有提供地址_网络是怎样连接的 -- web服务器接到请求后将会做什么...
  4. visionmaster视觉软件说明书_测试策略与软件需求层次
  5. jquery拼接后css样式不生效_JQuery常用选择器以及操作属性和样式的方法介绍
  6. 云南初中生计算机相关赛事,第14届中国大学生计算机设计大赛云南赛区决赛举行...
  7. Java设计模式(十二):状态设计模式
  8. 大规模的服务器如何管理--批量管理工具
  9. Applicatin、 server、 session 、cookies对象的简单使用方法
  10. C#在DataTable中使用LINQ