题目

【题目描述】

小强要在 $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. Hibernate学习---第九节:Hibernate之hql

    一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; impor ...

  2. poj3585 Accumulation Degree[树形DP换根]

    思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...

  3. Android TextView跑马灯

    <TextView android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  4. Sublime 实践

    1.下载开发版:http://www.sublimetext.com/dev 2.安装Package control: (1)按键ctrl+~ (2)在命令行中输入:  import urllib2, ...

  5. CentOS6.5中的vsftpd安装配置

    安装ftp 1.使用chkconfig 来查看是否装有vsftpd服务: 2.使用yum命令直接安装:yum -y install vsftpd 3.然后为它创建日志文件:touch /var/log ...

  6. POJ1365:素数

    Prime Land Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3552   Accepted: 1609 Descri ...

  7. mysql命令之一:mysql常用命令之一

    一.登录 1.本地登录:MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) C:\>mysql -h localhost -u roo ...

  8. JVM体系结构之五:本地方法栈

    对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方法接口来访问虚拟机的运行 ...

  9. hdu 5600 N bulbs 想法+奇偶讨论

    http://acm.hdu.edu.cn/showproblem.php?pid=5600 本文重在分析该题目的思路,代码极其短,但是想到这个题目的思路却是挺复杂的过程. 思路 自己拿到题目也想到了 ...

  10. bzoj4403

    组合数学 我好菜啊 想到dp去了... 事实上对于固定长度的数列,我们只用考虑选了哪些数就行了,所以这个就是$C(n+m-1,m-1)$ 也就是$n$个数,划分成$m$段且允许空的方案数 然后变成$\ ...