题目

【题目描述】

小强要在 $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. C++quickSort

    void QuickSort1(int *s,int left,int right){ int i,j,t,pivot; if(left>right) return; if(left<ri ...

  2. (转)C协程实现的效率对比

    前段时间实现的C协程依赖栈传递参数,在开启优化时会导致错误,于是实现了一个ucontext的版本,但ucontext的切换效率太差了, 在我的机器上执行4000W次切换需要11秒左右,这达不到我的要求 ...

  3. sws_scale函数的用法-具体应用

    移植ffmpeg过程中,遇到swscale的用法问题,所以查到这篇文章.文章虽然已经过去很长时间,但是还有颇多可以借鉴之处.谢谢“咕咕鐘". 转自:http://guguclock.blog ...

  4. 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie

    题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...

  5. 向vivi中加入命令

    在vivi的lib/command.c中添加自己的命令 核心数据结构user_command. typedef struct user_command { const char *name;      ...

  6. JS上传图片-通过FileReader获取图片的base64

    下面文章,我想要的是: FileReader这个对象,可以借助FileReader来获取上传图片的base64,就可以在客户端显示该图片了.同时,还可以把该图片的base64发送到服务端,保存起来. ...

  7. Operating System-Process(2)进程表&&中断处理

    上一篇文章阐述了进程的基本信息,本文主要介绍进程的实现,主要内容: 进程表(Process Table or Process Control Blocks) 中断处理(Interrupt) 一.进程表 ...

  8. mina中的发送延时

    由于项目需要,用到了 mina 框架进行 tcp 通讯.我是初次接触 mina,于是从 Hello world 开始学习了 mina .期间遇到了一个奇怪的发送数据的延迟问题,解决的过程是曲折的,但找 ...

  9. 关于 vs 2012 键盘无法输入的问题

    使用vs2012 新建了一个类文件之后,vs2012的编辑界面突然出现奇怪的问题,键盘无法输入! 最后调查的结果是由于resharper插件导致的. 可以将插件禁用然后启用. 也可以删除resharp ...

  10. body-parser 是一个Http请求体解析中间件

    1.这个模块提供以下解析器 (1) JSON body parser (2) Raw body parser (3)Text body parser (4)URL-encoded form body ...