bzoj 4530 [Bjoi2014]大融合——LCT维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530
LCT维护子树 siz 。设 sm[ ] 表示轻儿子的 siz 和+1(1是自己的siz),siz[ ] 表示 splay 里 ( 两个儿子的 siz[ ] ) + sm[ cr ] 。在 access 里随便维护一下就好了。
一开始写的 siz[ ] 是 splay 里右儿子的 siz[ ] + sm[ cr ] ,但打 rev[ ] 的时候难以维护,所以弃了。
注意要先让一个点作为 splay 的根,再给它连右儿子,才能比较好地维护好;所以 link( ) 的时候注意 access( y ) !
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int N=1e5+5; int n,Q,fa[N],c[N][2],siz[N],sm[N]; int sta[N],top;bool rev[N]; int rdn() {int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret; } bool isroot(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;} void pshp(int x){siz[x]=sm[x]+siz[c[x][0]]+siz[c[x][1]];} void Rev(int x) {if(!rev[x])return;rev[x]=0;rev[c[x][0]]^=1;rev[c[x][1]]^=1;swap(c[x][0],c[x][1]); } void rotate(int x) {int y=fa[x],z=fa[y],d=(x==c[y][1]);if(!isroot(y))c[z][y==c[z][1]]=x;fa[x]=z;fa[y]=x;fa[c[x][!d]]=y;c[y][d]=c[x][!d];c[x][!d]=y;pshp(y);pshp(x); } void splay(int x) {sta[top=1]=x;for(int k=x;!isroot(k);k=fa[k])sta[++top]=fa[k];for(int i=top;i;i--)Rev(sta[i]);int y,z;while(!isroot(x)){y=fa[x];z=fa[y];if(!isroot(y))((x==c[y][0])^(y==c[z][0]))?rotate(x):rotate(y);rotate(x);} } void access(int x) {int t=0;while(x){splay(x);sm[x]+=siz[c[x][1]];sm[x]-=siz[t];c[x][1]=t;pshp(x);/////t=x;x=fa[x];} } void makeroot(int x) {access(x);splay(x);rev[x]^=1; } void link(int x,int y) {makeroot(x);access(y);splay(y);//access()!!!fa[x]=y;sm[y]+=siz[x];siz[y]+=siz[x]; } ll query(int x,int y) {makeroot(x);access(y);splay(y);return (ll)siz[x]*sm[y]; } int main() {n=rdn();Q=rdn();for(int i=1;i<=n;i++)siz[i]=1,sm[i]=1;int x,y;char ch[3];while(Q--){scanf("%s",ch);x=rdn();y=rdn();if(ch[0]=='A')link(x,y);else printf("%lld\n",query(x,y));}return 0; }
转载于:https://www.cnblogs.com/Narh/p/10140314.html
bzoj 4530 [Bjoi2014]大融合——LCT维护子树信息相关推荐
- BZOJ 4530 大融合 LCT维护子树信息
题意: N<=1e5个点,Q<=1e5个操作. 支持加一条边(u,v)(保证图是森林).询问经过边(u,v)的简单路径条数(保证(u,v)存在). 分析: 数据结构学傻了的我,表示并不会用 ...
- 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息
题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...
- [BZOJ4530][Bjoi2014]大融合 LCT + 启发式合并
[BZOJ4530][Bjoi2014]大融合 试题描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是 ...
- LCT维护子树信息(BZOJ4530:[BJOI2014]大融合)
题面 没有权限号的可以去LOJ Sol 大家都知道,\(LCT\)上有许多实边和虚边 实边就是每棵\(Splay\)上的既认父亲又认儿子的边 虚边就是\(Splay\)和\(Splay\)之间只认父亲 ...
- [Bjoi2014]大融合
[Bjoi2014]大融合 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 394 Solved: 244 [Submit][Status][Dis ...
- BZOJ 3639: Query on a tree VII LCT_set维护子树信息
用 set 维护子树信息,细节较多. Code: #include <cstring> #include <cstdio> #include <algorithm> ...
- BZOJ4530:[BJOI2014]大融合
Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...
- bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了-- O( nlog ...
- 洛谷P4219 大融合(LCT、虚子树)
解析 本题需要用LCT维护子树大小 然后我就不会了 然后我就用树剖水过去了 又快又好写,真香 现在详细聊聊如何用LCT维护子树信息 每个结点再定义一个新的变量记录所有虚儿子的信息 然后-完了? 告别盲 ...
最新文章
- Calling Oracle stored procedures from Microsoft.NET
- Android图形子系统
- mysql dump xtrabackup_MySQL--备份恢复【Mysqdump+xtrabackup(XBK)】
- 在lean trace mode下运行function
- 线性表的定义与操作-顺序表,链式表(C语言)
- sql server的密码采用自带什么密码技术存储_【技术分享】浅谈MYSQL 8.0新特性
- Java教程:使用记事本编写运行Java程序
- 周志华-机器学习西瓜书-第三章习题3.3 编程实现对率回归
- c#使用正则表达式获取TR中的多个TD_Linux之正则表达式
- 京东一面:如何用 Nginx 禁止国外 IP 访问网站,直接凉凉!
- Apache --Tomcat 8下载与配置(Tomcat压缩包下载 Windows 7 x64)
- 新人学习opencv图像处理的笔记,一:c++操作图像放大
- 美国金融客户投诉数据分析
- ZYNQ芯片软硬件协同开发二:最简Linux操作系统的硬件部分设计
- windows神器,让你的效率直线提升
- 本题目要求读入2个整数A和B,然后输出它们的和
- LCD1602液晶显示屏的字符显示
- 解决农产品滞销难题,农村淘宝有何绝招?
- SharedPreferences使用及原理
- Linux Centos7:11.给系统增加一块硬盘