题目

【题目描述】

小强要在 $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. 代码题(14)— 合并有序链表、数组、合并K个排序链表

    1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...

  2. Git教程(二)-如何上传和同步自己的git项目

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Git接触并使用多年, 工作中使用较多,它的分布式存储,使每个人的电脑均为服务器的策略非常棒:再加上 ...

  3. PHP消息队列用法实例分析

    这篇文章主要介绍了PHP消息队列用法,结合实例形式分析了PHP消息队列用于Linux下进程间通信的相关技巧,需要的朋友可以参考下   该消息队列用于linux下,进程通信 队列状态信息:具体参考手册

  4. elasticsearch的store属性跟_source字段——如果你的文档长度很长,存储了_source,从_source中获取field的代价很大,你可以显式的将某些field的store属性设置为yes,否则设置为no

    转自:http://kangrui.iteye.com/blog/2262860 众所周知_source字段存储的是索引的原始内容,那store属性的设置是为何呢?es为什么要把store的默认取值设 ...

  5. ES提高数据压缩的设置——单字段,去掉source和all

    curl -XPUT 'http://localhost:9200/hec_test3' -d ' { "mappings": { "hec_type3": { ...

  6. appium-环境搭建(三)

    appium步骤:基本环境1.由于操作手机端操作,需要模拟器或者真机 itools模拟器,真机2.appium操作app,需要知道操作的app是什么?需要知道这个app包名 1.问开发 2.利用adt ...

  7. UI层自动化测试介绍

    UI指的是用户可以用肉眼可以看到的页面. UI层自动化测试的原理.不论是web端还是移动端,原理都是一样的,就是基于页面元素的识别和定位来进行模拟用户行为. 首先识别到某个元素,比如一个按钮,然后定义 ...

  8. Android之SharedPreferences权限

    import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; pub ...

  9. 用JavaScript实现表单按回车自动提交

    JavaScript实现表单form1按回车自动提交代码如下: <script type="text/javascript"> function submitMe() ...

  10. [原]NYOJ-6174问题-57

    大学生程序代写 /*6174问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b ...