大融合——LCT维护子树信息
题目
【题目描述】
小强要在 $N$ 个孤立的星球上建立起一套通信系统。这套通信系统就是连接 $N$ 个点的一个树。这个树的边是一条一条添加上去的。在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量。
例如,在上图中,现在一共有五条边。其中,$(3,8)$ 这条边的负载是 $6$,因为有六条简单路径 $2-3-8,\ 2-3-8-7,\ 3-8,\ 3-8-7,\ 4-3-8,\ 4-3-8-7$ 路过了 $(3,8)$。
现在,你的任务就是随着边的添加,动态的回答小强对于某些边的负载的询问。
【输入格式】
第一行包含两个整数 $N,Q$,表示星球的数量和操作的数量。星球从 $1$ 开始编号。
接下来的 $Q$ 行,每行是如下两种格式之一:
``A x y`` 表示在 $x$ 和 $y$ 之间连一条边。保证之前 $x$ 和 $y$ 是不联通的。
``Q x y`` 表示询问 $(x,y)$ 这条边上的负载。保证 $x$ 和 $y$ 之间有一条边。
【输出格式】
对每个查询操作,输出被查询的边的负载。
【样例输入】
8 6
A 2 3
A 3 4
A 3 8
A 8 7
A 6 5
Q 3 8
【样例输出】
6
【数据范围与提示】
对于所有数据,$1 \leq N,Q \leq 100000$。
题解
用树剖维护子树信息的模板题
因为虚树不认儿子,所以单独开一个数组维护以该节点为 father 的虚树的信息。
操作中只有 link access 会修改,pushup 即可
为什么 split 的 y 不翻转就会 wa
代码
#include<bits/stdc++.h>
#define LL long long
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
int R(){
int x;bool f=;char ch;_(!)if(ch=='-')f=;x=ch^;
_()x=(x<<)+(x<<)+(ch^);return f?x:-x;}
const int N=1e5+;
int n,m;
char ch[];
class Link_Cut_Tree{
private:
#define Ls(x) ch[x][0]
#define Rs(x) ch[x][1]
int ch[N][],fa[N],rev[N],q[N];
void pushup(int x){sum[x]=sum[Ls(x)]+sum[Rs(x)]+sz[x]+;}
bool nroot(int x){return Ls(fa[x])==x||Rs(fa[x])==x;}
void pushdown(int x){
if(rev[x]){
swap(Ls(x),Rs(x));
rev[Ls(x)]^=,rev[Rs(x)]^=;
rev[x]=;
}
}
void rotate(int x){
int y=fa[x],z=fa[y],fl=(Rs(y)==x),w;
if(nroot(y))ch[z][Rs(z)==y]=x;
ch[y][fl]=(w=ch[x][!fl]),ch[x][!fl]=y;
if(w)fa[w]=y;fa[y]=x,fa[x]=z;
pushup(y);return;}
void splay(int x){
int y=x,top=,z;q[++top]=y;
while(nroot(y))q[++top]=y=fa[y];
while(top)pushdown(q[top--]);
while(nroot(x)){
y=fa[x],z=fa[y];
if(nroot(y))
rotate((Ls(y)==x)^(Ls(z)==y)?x:y);
rotate(x);}
pushup(x);return;}
void access(int x){
for(int y=;x;y=x,x=fa[x])
splay(x),sz[x]+=sum[Rs(x)]-sum[y],Rs(x)=y,pushup(x);
}
void makeroot(int x){access(x),splay(x),rev[x]^=;}
public:
LL sz[N],sum[N];
void split(int x,int y){makeroot(x),makeroot(y);}
void link(int u,int v){split(u,v),fa[u]=v,sz[v]+=sum[u],pushup(v);}
}T;
int main(){
n=R(),m=R();
for(int i=;i<=n;i++)T.sum[i]=;
for(int i=,u,v;i<=m;i++){
scanf("%s",ch+),u=R(),v=R();
if(ch[]=='A')T.link(u,v);
else T.split(u,v),printf("%lld\n",T.sum[u]*(T.sum[v]-T.sum[u]));
}
return ;
}
大融合——LCT维护子树信息的更多相关文章
- 【bzoj4530】[Bjoi2014]大融合 LCT维护子树信息
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量 ...
- BZOJ4530[Bjoi2014]大融合——LCT维护子树信息
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它的简单路径的数 ...
- bzoj 4530 [Bjoi2014]大融合——LCT维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530 LCT维护子树 siz .设 sm[ ] 表示轻儿子的 siz 和+1(1是自己的si ...
- bzoj 4530 大融合 —— LCT维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530 用LCT维护子树 size,就是实边和虚边分开维护: 看博客:https://blog ...
- Loj 2230. 「BJOI2014」大融合 (LCT 维护子树信息)
链接:https://loj.ac/problem/2230 思路: 设立siz数组保存虚点信息,sum表示总信息 维护子树信息link操作和access操作需要进行一些改动 可参考博客:https: ...
- [BJOI2014]大融合 LCT维护子树信息
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...
- P4219 [BJOI2014]大融合 LCT维护子树大小
\(\color{#0066ff}{ 题目描述 }\) 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一 ...
- 洛谷4219 BJOI2014大融合(LCT维护子树信息)
QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...
- 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息
题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...
随机推荐
- Tomcat_异常_01_Setting property 'source' to 'org.eclipse.jst.jee.server:AWeiXin_QiYe_Demo' did not find a matching property
关于解决方法: 1.解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题 2.eclipse中server location为灰色 ...
- java--Hibernate实现分页查询
首先在Action类定义当前页的值 private Integer currPage = 1 setter,getter 在spring IOC容器进行注入该变量 在Action类写一个findAll ...
- 【C/C++】assert
摘自http://www.cplusplus.com assert : macro #include <assert.h> void assert (int expression); 如果 ...
- gulp安装简介
1 全局安装gulp:npm install -g gulp 2 在项目根目录中,安装项目的开发依赖:npm install --save-dev gulp 2.1 根据gulpfile.js中的依赖 ...
- js中this
首先声明,我是小白,以下只是自己的简单理解. 先看下面的代码: (function () { console.log(this); })(); 毫无疑虑,输出的是window. 在看下面代码: (fu ...
- Python-Redis的List操作
Redis列表是简单的字符串列表,一个列表可以包含超过40亿个元素 lpush(name,values):在name对应的list中添加元素,每个新的元素都添加到列表的最左边 rpush(name, ...
- js点滴知识(1) -- 获取DOM对象和编码
在今天的工作中发现了一些小的问题,在网上查了一下,才知道自己的js才是冰山一角,以后要虚心向他人学习,要虚怀若谷. 发现一:js获取DOM对象与jquery的区别 先前总以为,二者是一样的,最近才知道 ...
- js拼的onclick调用方法需要注意的地方 之二
那如果之前的方法不行,想传递json对象怎么办呢? 使用下面这种方法, getA = function(){ var obj = {'projectId':123,'projectName':'aac ...
- linux命令-vim一般模式下复制剪切粘贴
删除光标后的一个字符 x 删除光标前的一个字符 shift+x 删除指定个数的字符 数字+x 删除一行字符 dd 剪切指定行数 数字dd 3dd 剪切3行 其实并没有删掉而是保存着剪切板里 粘贴在 ...
- hive 集群初探,查询比较
在slave3安装MySQL作为hive 的matastore [root@slave3 hadoop]# yum search mysql [root@slave3 hadoop]# yum ins ...