题目

【题目描述】

小强要在 $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维护子树信息的更多相关文章

  1. 【bzoj4530】[Bjoi2014]大融合 LCT维护子树信息

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

  2. BZOJ4530[Bjoi2014]大融合——LCT维护子树信息

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

  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维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530 用LCT维护子树 size,就是实边和虚边分开维护: 看博客:https://blog ...

  5. Loj 2230. 「BJOI2014」大融合 (LCT 维护子树信息)

    链接:https://loj.ac/problem/2230 思路: 设立siz数组保存虚点信息,sum表示总信息 维护子树信息link操作和access操作需要进行一些改动 可参考博客:https: ...

  6. [BJOI2014]大融合 LCT维护子树信息

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...

  7. P4219 [BJOI2014]大融合 LCT维护子树大小

    \(\color{#0066ff}{ 题目描述 }\) 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一 ...

  8. 洛谷4219 BJOI2014大融合(LCT维护子树信息)

    QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...

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

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

随机推荐

  1. Linux学习过程中的简单命令

    1.su su- 与 sudo     (1) 普通用户和root转换:su 用户名或root              不知道root密码的情况下:普通 -> root:sudo su roo ...

  2. IP通信中音频编解码技术与抗丢包技术概要

    此文较长,建议收藏起来看. 一.一个典型的IP通信模型 二.Server2Server技术分类 Server2Server这块也是一个专门的领域,这里只简单分个类. 1.同一国家相同运营商之间: 同一 ...

  3. ACM学习历程—Rotate(HDU 2014 Anshan网赛)(几何)

    Problem Description Noting is more interesting than rotation! Your little sister likes to rotate thi ...

  4. bzoj 4540: [Hnoi2016]序列 莫队

    题目: 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- 1,ar.若1≤l≤s≤t≤r≤n,则称a[s:t]是a ...

  5. S3C2410中文芯片手册-11.串口

    目录 11 UART Overview Featrues UART Operation Data Transmission Data Reception Auto Flow Control(AFC) ...

  6. 洛谷【P1908】逆序对

    题目传送门:https://www.luogu.org/problemnew/show/P1908 所谓逆序对,就是序列中\(a[i]>a[j]\)且\(i<j\)的有序对. 所以我们在归 ...

  7. 洛谷【P1358】扑克牌

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:https://www.luogu.org/problemnew/show/P ...

  8. Maven 排除依赖jar包

    当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖 比如我们不想引入传递性依赖commons-logging,我们可以使用exclusi ...

  9. mysql基础之三:char与varchar区别,varchar(M)能存多少

    char与varchar区别 char (13)长度固定, 如'1234567890' 存储需要空间 10个字符; varchar(13) 可变长 如'1234567890' 需要存储空间 11字符; ...

  10. Java父类构造器的讲解

    众所周知,对于Java中的所有类而言,它们有一个根父类,即java.lang.Object类. 对于Java中构造器执行的顺序而言,程序执行的顺序为,先执行父类的非静态代码块,然后执行父类的相应的构造 ...