题目描述

小强要在N个孤立的星球上建立起一套通信系统。这套通信系统就是连接N个点的一个树。
这个树的边是一条一条添加上去的。在某个时刻,一条边的负载就是它所在的当前能够
联通的树上路过它的简单路径的数量。
例如,在上图中,现在一共有了5条边。其中,(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之间有一条边。
1≤N,Q≤100000

输出

对每个查询操作,输出被查询的边的负载。

样例输入

8 6
A 2 3
A 3 4
A 3 8
A 8 7
A 6 5
Q 3 8

样例输出

6
 
加边操作保证两个联通块都是树,那么LCT维护就好了嘛!
因为查询时保证x,y之间有边,那么先将x旋到原树的根reverse(x),再将y到根路径变成重链access(y)并将y旋成splay的根splay(y)。
这样x就是y的左儿子,查询的就是x子树大小和整棵树大小-x子树大小的乘积。注意这里的子树是指原树中的子树。
平常我们做的LCT都是维护树上路径信息,其实LCT也能维护子树信息。
我们将LCT上一个点的子节点分为两种:一种是实子节点,也就是这个点在splay上的左右子节点;另一种是虚子节点,就是指向这个点的节点,也就是原树中这个点的轻儿子。
LCT维护的路径信息是什么?一个点的权值+实子节点子树中的权值和。
那么LCT维护的子树信息呢?就是一个点的权值+实子节点子树中的权值和+虚子节点子树中的权值和。
怎么上传虚节点的信息呢?每个节点维护两个信息,一个是原树中整个子树的节点数,一个是原树中所有虚子节点子树的节点数之和。
我们考虑在什么地方会改变虚子节点的信息:
1、在access时一个点的右子节点会变成虚子节点,而上一次splay的节点会变成这个点的右子节点。
2、在link(x,y)时会将x指向y,这时y的虚子节点会多一个x,因此要更新y的信息。
知道怎么维护子树信息后就可以LCT过这道题了,注意答案爆int。

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int x,y;
char ch[3];
int s[100010][2];
int f[100010];
int r[100010];
int st[100010];
int size[100010];
int sum[100010];
int get(int rt)
{
return rt==s[f[rt]][1];
}
void pushup(int rt)
{
sum[rt]=sum[s[rt][0]]+sum[s[rt][1]]+size[rt]+1;
}
void pushdown(int rt)
{
if(r[rt])
{
r[s[rt][0]]^=1;
r[s[rt][1]]^=1;
r[rt]^=1;
swap(s[rt][0],s[rt][1]);
}
}
int is_root(int rt)
{
return rt!=s[f[rt]][0]&&rt!=s[f[rt]][1];
}
void rotate(int rt)
{
int fa=f[rt];
int anc=f[fa];
int k=get(rt);
if(!is_root(fa))
{
s[anc][get(fa)]=rt;
}
s[fa][k]=s[rt][k^1];
f[s[fa][k]]=fa;
s[rt][k^1]=fa;
f[fa]=rt;
f[rt]=anc;
pushup(fa);
pushup(rt);
}
void splay(int rt)
{
int top=0;
st[++top]=rt;
for(int i=rt;!is_root(i);i=f[i])
{
st[++top]=f[i];
}
for(int i=top;i>=1;i--)
{
pushdown(st[i]);
}
for(int fa;!is_root(rt);rotate(rt))
{
if(!is_root(fa=f[rt]))
{
rotate(get(fa)==get(rt)?fa:rt);
}
}
}
void access(int rt)
{
for(int x=0;rt;x=rt,rt=f[rt])
{
splay(rt);
size[rt]+=sum[s[rt][1]]-sum[x];
s[rt][1]=x;
pushup(rt);
}
}
void reverse(int rt)
{
access(rt);
splay(rt);
r[rt]^=1;
}
void link(int x,int y)
{
reverse(x);
reverse(y);
f[x]=y;
size[y]+=sum[x];
pushup(y);
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%s",ch);
scanf("%d%d",&x,&y);
if(ch[0]=='A')
{
link(x,y);
}
else
{
reverse(x);
reverse(y);
printf("%lld\n",1ll*(sum[y]-sum[x])*sum[x]);
}
}
}

BZOJ4530[Bjoi2014]大融合——LCT维护子树信息的更多相关文章

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

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530 LCT维护子树 siz .设 sm[ ] 表示轻儿子的 siz 和+1(1是自己的si ...

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

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

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

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

  5. bzoj 4530 大融合 —— LCT维护子树信息

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

  6. 大融合——LCT维护子树信息

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

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

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

  8. [BZOJ4530][Bjoi2014]大融合 LCT + 启发式合并

    [BZOJ4530][Bjoi2014]大融合 试题描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是 ...

  9. BZOJ4530:[BJOI2014]大融合(LCT)

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

随机推荐

  1. XD308H设计超宽电压非隔离电源 MP150电源芯片

    220V转12V 220V转24V 380V转5V 3800V转12V 380V转24V 参考:https://wenku.baidu.com/view/862c19fca0c7aa00b52acfc ...

  2. 使用Webuploader大文件分片传输

    背景:50G大文件的HTTP上传至服务器. 好了,根据这个命题,可以开始研究我们怎么做才能把这么大的文件上传成功. 分片上传是肯定的,断点续传也是要有的,进度可视化那就更好了,基于这些,我选择了Web ...

  3. git使用备注

    git clone 代码库地址 git branch -r  查看远程分支 git branch 查看本地分支 git branch -a 查看远程和本地分支.带*的表示正在所处分支. git bra ...

  4. TCP/IP协议--TCP的超时和重传

    TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...

  5. DeskMini无传统机械键盘与鼠标接口的情况下使用U盘安装系统经验总结

    总结安装纯净版Win7旗舰版系统安装过程所解决的问题要点: 1:UEFI引导启动的实现. 2:使用Dism++实现系统的安装. 3:使用Dism++解决新主板在安装系统过程中不能使用USB键盘和鼠标的 ...

  6. php WNMP(Windows+Nginx+Mysql+php)配置笔记

    下载安装 php 修改nginx 文件 参考云盘实例 eclipse php配置服务ip 127.0.0.1:999 以及项目路径(php解析路径)

  7. Luogu P2827 蚯蚓

    看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很naive的 注意在用堆做的时候也是要明智一点的,对于蚯蚓长度的相加肯定不能直接遍历并加上,还是可以差分一下的 其实说白了就是把集体加->单 ...

  8. Luogu T29912 fuck

    这是QZEZ的Luogu团队中的一道难得的水题,题面和数据都是CJJ dalao出的,然后我就没有太看懂题意. 也是一道经典的割点好题,但需要一定的思维. 首先对于题意,它只需要得到切断的作用就可以了 ...

  9. OLED小记

    1.点阵组成OLED,OLED中有一个GRAM区域,区域中的值直接刷新到屏幕上,对应关系是1bit对应一个像素点: 2.要点亮一个像素点,只需要将GRAM中的对应bit位写1即可.GRAM中是分页来管 ...

  10. Nancy异步用法

    个人笔记,记录Nancy异步用法 基类,所有请求都将首先执行该类,并执行Before事件 namespace CxyAdvert.Base { public class BaseNancyModel ...