[BJOI2014]大融合
Description
给你一个n个点的森林,要求支持m个操作:
1.连接两个点 x,y
2.询问若断掉 x,y这条边,两点所在联通块乘积的大小
Hint:
\(n,m<=10^5\)
Solution:
\(LCT\)维护子树\(size\):
对于每一个点维护\(b[i]\)表示\(i\)点的虚子树大小
每次\(access\)动态更新\(b[i]\)
\(sz[]\)便可以直接\(push\_up\)
#include<bits/stdc++.h>
using namespace std;
const int mxn=1e5+5;
int n,m,t[mxn],fa[mxn],st[mxn],sz[mxn],b[mxn],rev[mxn],val[mxn],ch[mxn][2];
namespace lct {
int isnotrt(int x) {
return ch[fa[x]][0]==x||ch[fa[x]][1]==x;
};
void push_up(int x) {
t[x]=t[ch[x][0]]^t[ch[x][1]]^val[x];
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+b[x]+1;
};
void push_down(int x) {
if(rev[x]) {
rev[ch[x][0]]^=1,rev[ch[x][1]]^=1;
swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
rev[x]=0;
}
}
void rotate(int x) {
int y=fa[x],z=fa[y],tp=ch[y][1]==x;
if(isnotrt(y)) ch[z][ch[z][1]==y]=x;/**/ fa[x]=z;
ch[y][tp]=ch[x][tp^1],fa[ch[x][tp^1]]=y;
ch[x][tp^1]=y,fa[y]=x;
push_up(y),push_up(x);
};
void splay(int x) {
int tp=x,s=0; st[++s]=tp;
while(isnotrt(tp)) st[++s]=tp=fa[tp];
while(s) push_down(st[s--]);
while(isnotrt(x)) {
int y=fa[x],z=fa[y];
if(isnotrt(y))
(ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);
rotate(x);
}
};
void access(int x) {
for(int y=0;x;x=fa[y=x])
splay(x),b[x]+=sz[ch[x][1]],b[x]-=sz[ch[x][1]=y],push_up(x);
};
void makert(int x) {
access(x); splay(x);
swap(ch[x][0],ch[x][1]);
rev[x]^=1;
};
int findrt(int x) {
access(x); splay(x);
while(ch[x][0]) push_down(x),x=ch[x][0];
splay(x); return x;
};
void split(int x,int y) {
makert(x); access(y); splay(y);
};
void link(int x,int y) {
split(x,y);
fa[x]=y,b[y]+=sz[x],push_up(y); //因为维护的是子树信息,故为了防止对其他节点信息产生影响,合并时两点都必须splay到根
};
}
using namespace lct;
int main()
{
scanf("%d%d",&n,&m); int x,y; char opt[10];
while(m--) {
scanf("%s %d %d",opt,&x,&y);
if(opt[0]=='Q') {
makert(x); access(y); splay(y);
printf("%lld\n",1ll*(sz[y]-sz[x])*(sz[x]));
}
else if(opt[0]=='A') link(x,y);
}
return 0;
}
[BJOI2014]大融合的更多相关文章
- [BZOJ4530][Bjoi2014]大融合 LCT + 启发式合并
[BZOJ4530][Bjoi2014]大融合 试题描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是 ...
- BZOJ:4530: [Bjoi2014]大融合
4530: [Bjoi2014]大融合 拿这题作为lct子树查询的练手.本来以为这会是一个大知识点,结果好像只是一个小技巧? 多维护一个虚边连接着的子树大小即可. #include<cstdio ...
- BZOJ_4530_[Bjoi2014]大融合_LCT
BZOJ_4530_[Bjoi2014]大融合_LCT Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个 ...
- 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
大融合 bzoj-4530 Bjoi-2014 题目大意:n个点,m个操作,支持:两点连边:查询两点负载:负载.边(x,y)的负载就是将(x,y)这条边断掉后能和x联通的点的数量乘以能和y联通的点的数 ...
- 【bzoj4530】[Bjoi2014]大融合 LCT维护子树信息
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量 ...
- BZOJ4530: [Bjoi2014]大融合
Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...
随机推荐
- mysql系列十二、mysql常用hint
对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的. 强制索引 FORCE ...
- 【转】OpenCV对图片中的RotatedRect进行填充
函数名:full_rotated_rect 函数参数: image输入图像,rect希望在图像中填充的RotatedRect,color填充的颜色 主要的思路是:先找到RotatedRect的四个顶点 ...
- SQL日期时间和字符串函数
- tsconfig.json配置
什么工具看什么官网-一般都会有说明的 https://www.tslang.cn/docs/handbook/tsconfig-json.html 概述 如果一个目录下存在一个tsconfig.jso ...
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于“Android 震动马达系统“的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的,是想彻底的了解从硬件到驱动 ...
- 【docker】资料
https://yeasy.gitbooks.io/docker_practice/content/network/linking.html
- CNN卷积核计算
作者:十岁的小男孩 目录 单层卷积核计算 三维卷积核计算 Padding=Valid&&Same 总结
- python+selenium八:Alert弹窗
此弹窗是浏览器自带的弹窗,不是html中的元素 from selenium import webdriverfrom selenium.webdriver.common.action_chains i ...
- python接口自动化测试十三:url编码与解码
# url编码与解码 from urllib import parse url = 'http://zzk.cnblogs.com/s/blogpost?Keywords=中文' a = '中文' b ...
- this和super不能同时出现在构造方法中
package com.bjpowernode.t02inheritance.c09; /* * 使用super调用父类的构造方法 */public class TestSuper02 { publi ...