BZOJ_4530_[Bjoi2014]大融合_LCT
BZOJ_4530_[Bjoi2014]大融合_LCT
Description

Input
Output
Sample Input
A 2 3
A 3 4
A 3 8
A 8 7
A 6 5
Q 3 8
Sample Output
6
我们都知道正常LCT维护的是一些链的信息。
splay的根不一定连向树上的儿子,这样丢失了儿子的信息。因此无法维护子树信息。
需要在一些操作中加入对子树信息的变动。
设all[x]为x子树结点个数,siz[x]为x子树不在链上结点个数。
注意到access操作割掉了rs加入了t,因此不在链上结点个数需要加rs减去t。
然后link操作也改变了子树信息,需要对两个结点分别更新,makeroot两次即可。
上传函数也改一下。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int ch[N][2],f[N],rev[N],siz[N],all[N],n,m;
char opt[10];
inline bool isrt(int p) {
return ch[f[p]][0]!=p&&ch[f[p]][1]!=p;
}
inline void pushdown(int p) {
if(rev[p]) {
swap(ch[ls][0],ch[ls][1]); swap(ch[rs][0],ch[rs][1]);
rev[ls]^=1; rev[rs]^=1; rev[p]=0;
}
}
inline void pushup(int p) {
all[p]=all[ls]+all[rs]+siz[p]+1;
}
void update(int p) {
if(!isrt(p)) update(f[p]);
pushdown(p);
}
void rotate(int x) {
int y=f[x],z=f[y],k=get(x);
if(!isrt(y)) ch[z][ch[z][1]==y]=x;
ch[y][k]=ch[x][!k]; f[ch[y][k]]=y;
ch[x][!k]=y; f[y]=x; f[x]=z;
pushup(y); pushup(x);
}
void splay(int x) {
update(x);
for(int fa;fa=f[x],!isrt(x);rotate(x))
if(!isrt(fa))
rotate(get(fa)==get(x)?fa:x);
}
void access(int p) {
int t=0;
while(p) splay(p),siz[p]+=all[rs]-all[t],rs=t,pushup(p),t=p,p=f[p];
}
void makeroot(int p) {
access(p); splay(p); swap(ls,rs); rev[p]^=1;
}
void link(int x,int p) {
makeroot(x); makeroot(p); f[x]=p; siz[p]+=all[x]; pushup(p);
}
int main() {
scanf("%d%d",&n,&m);
int i,x,y;
for(i=1;i<=n;i++) all[i]=1;
for(i=1;i<=m;i++) {
scanf("%s%d%d",opt,&x,&y);
if(opt[0]=='A') {
link(x,y);
}else {
makeroot(x); makeroot(y);
printf("%lld\n",1ll*all[x]*(all[y]-all[x]));
}
}
}
BZOJ_4530_[Bjoi2014]大融合_LCT的更多相关文章
- [bzoj4530][Bjoi2014]大融合_LCT
		
大融合 bzoj-4530 Bjoi-2014 题目大意:n个点,m个操作,支持:两点连边:查询两点负载:负载.边(x,y)的负载就是将(x,y)这条边断掉后能和x联通的点的数量乘以能和y联通的点的数 ...
 - [BZOJ4530][Bjoi2014]大融合  LCT + 启发式合并
		
[BZOJ4530][Bjoi2014]大融合 试题描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是 ...
 - BZOJ:4530: [Bjoi2014]大融合
		
4530: [Bjoi2014]大融合 拿这题作为lct子树查询的练手.本来以为这会是一个大知识点,结果好像只是一个小技巧? 多维护一个虚边连接着的子树大小即可. #include<cstdio ...
 - P4219 [BJOI2014]大融合(LCT)
		
P4219 [BJOI2014]大融合 对于每个询问$(u,v)$所求的是 ($u$的虚边子树大小+1)*($v$的虚边子树大小+1) 于是我们再开个$si[i]$数组表示$i$的虚边子树大小,维护一 ...
 - 洛谷 P4219 [BJOI2014]大融合 解题报告
		
P4219 [BJOI2014]大融合 题目描述 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的 ...
 - 洛谷P4219 - [BJOI2014]大融合
		
Portal Description 初始有\(n(n\leq10^5)\)个孤立的点,进行\(Q(Q\leq10^5)\)次操作: 连接边\((u,v)\),保证\(u,v\)不连通. 询问有多少条 ...
 - [BJOI2014]大融合(Link Cut Tree)
		
[BJOI2014]大融合(Link Cut Tree) 题面 给出一棵树,动态加边,动态查询通过每条边的简单路径数量. 分析 通过每条边的简单路径数量显然等于边两侧节点x,y子树大小的乘积. 我们知 ...
 - 【bzoj4530】[Bjoi2014]大融合  LCT维护子树信息
		
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量 ...
 - BZOJ4530: [Bjoi2014]大融合
		
Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...
 
随机推荐
- 前端技术之_CSS详解第四天
			
前端技术之_CSS详解第四天 一.第三天的小总结 盒模型box model,什么是盒子? 所有的标签都是盒子.无论是div.span.a都是盒子.图片.表单元素一律看做文本. 盒模型有哪些组成: wi ...
 - web 高并发分析
			
<高并发Web系统的设计与优化>的读后感 一口气看完了<高并发Web系统的设计与优化>,感觉受益匪浅,作者从高并发开始讨论问题,并逐步给出了非常有建设性的想法和建议,是值得我们 ...
 - [C#网络应用编程]2、对线程的管理
			
在System.Threading命名空间下,有一个Thread类,用于对线程进行管理,如创建线程.启动线程.终止线程.合并线程.让线程休眠等 Thread类 (假设Thread firTh = ne ...
 - threesum
			
算法题 问题描述:在一些给定的数中,找到三个数,他们相加的和是0,并且这三个数的组合是不能重复的 例子: input [-1, 0, -1, 2, 1] Output [[-1, 1 ,0], [-1 ...
 - 基于Cloudera Search设计数据灾备方案
			
当实际项目上线到生产环境中,难以避免一些意外情况,如数据丢失.服务器停机等.对于系统的搜索服务来说,当遇到停机的情况意味着在停机这段时间内,用户都不能通过搜索的相关功能进行访问数据,停机意味着将这一段 ...
 - 遍历php数组的几种方法
			
第一.foreach() foreach()是一个用来遍历数组中数据的最简单有效的方法. <?php $urls= array('aaa','bbb','ccc','ddd'); foreach ...
 - 分布式任务调度平台XXL-JOB
			
<分布式任务调度平台XXL-JOB> 一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...
 - Python的logging日志
			
日志级别:critical > error > warning > info > debug,notset级别越高打印的日志越少,反之亦然,即debug : 打印全部的日志(n ...
 - Python_异常处理结构与调试
			
while True: x =input('Pleaes input:') try: x=int(x) print('You have input {0}'.format(x)) break exce ...
 - 微信小程序 bug及解决方案
			
1.小程序遮罩滚动穿透问题 解决方案: <view class="mask" wx:if="{{showVipRights}}" catchtap='hi ...