LOJ#2230. 「BJOI2014」大融合

题目描述

小强要在$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$。


题解Here!

$LCT$大法好!

维护虚树中每个节点的虚子节点个数。

连边时注意:不是$makeroot$,是$split$。(坑了我好久。。。)

还有$access$时维护一下即可。

最后答案就是:

$$\text{x的虚子节点个数}\times(\text{y的虚子节点个数}-\text{x的虚子节点个数})$$

附代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 100010
using namespace std;
int n,m;
struct node{int f,v,s,flag,son[2];
}a[MAXN];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline bool isroot(int rt){return a[a[rt].f].son[0]!=rt&&a[a[rt].f].son[1]!=rt;
}
inline void pushup(int rt){if(!rt)return;a[rt].s=a[a[rt].son[0]].s+a[a[rt].son[1]].s+a[rt].v+1;
}
inline void pushdown(int rt){if(!rt||!a[rt].flag)return;a[a[rt].son[0]].flag^=1;a[a[rt].son[1]].flag^=1;a[rt].flag^=1;swap(a[rt].son[0],a[rt].son[1]);
}
inline void turn(int rt){int x=a[rt].f,y=a[x].f,k=a[x].son[0]==rt?1:0;if(!isroot(x)){if(a[y].son[0]==x)a[y].son[0]=rt;else a[y].son[1]=rt;}a[rt].f=y;a[x].f=rt;a[a[rt].son[k]].f=x;a[x].son[k^1]=a[rt].son[k];a[rt].son[k]=x;pushup(x);pushup(rt);
}
void splay(int rt){int top=0,stack[MAXN];stack[++top]=rt;for(int i=rt;!isroot(i);i=a[i].f)stack[++top]=a[i].f;while(top)pushdown(stack[top--]);while(!isroot(rt)){int x=a[rt].f,y=a[x].f;if(!isroot(x)){if((a[y].son[0]==x)^(a[x].son[0]==rt))turn(rt);else turn(x);}turn(rt);}
}
void access(int rt){for(int i=0;rt;i=rt,rt=a[rt].f){splay(rt);a[rt].v+=a[a[rt].son[1]].s-a[i].s;a[rt].son[1]=i;pushup(rt);}
}
inline void makeroot(int rt){access(rt);splay(rt);a[rt].flag^=1;}
inline void split(int x,int y){makeroot(x);access(y);splay(y);}
inline void link(int x,int y){split(x,y);a[x].f=y;a[y].v+=a[x].s;pushup(y);
}
void work(){char ch[2];int x,y;n=read();m=read();for(int i=1;i<=n;i++)a[i].s=1;while(m--){scanf("%s",ch);x=read();y=read();if(ch[0]=='A')link(x,y);if(ch[0]=='Q'){split(x,y);printf("%lld\n",(long long)a[x].s*(a[y].s-a[x].s));}}
}
int main(){work(); return 0;
}

转载于:https://www.cnblogs.com/Yangrui-Blog/p/9940964.html

LOJ#2230. 「BJOI2014」大融合相关推荐

  1. 【LOJ】#2230. 「BJOI2014」大融合

    题解 我现在真是太特么老年了 一写数据结构就颓废,难受 这题就是用lct维护子树 ???lct怎么维护子树 这样想,我们给每个点记录虚边所在的子树大小,只发生在Access和link的时候 这样的话我 ...

  2. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  3. Loj #2983. 「WC2019」数树

    Loj #2983. 「WC2019」数树 题目背景 白兔喜欢树. 白云喜欢数数. 有 \(n\) 只鼠,白兔用 \(n − 1\) 根蓝色绳子把它们连成了一棵树,每根蓝色绳子连着两只鼠,白云用 \( ...

  4. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

  5. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  6. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  7. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  8. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  9. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

最新文章

  1. TVM 各个模块总体架构
  2. Centos7.4 版本环境下安装Mysql5.7操作记录
  3. Spring 容器AOP的实现原理——动态代理
  4. 设计模式之UML类图
  5. Codeforces Round #480 (Div. 2) B. Marlin
  6. C#重载操作符==和!=时注意问题
  7. 数据库中有哪些连接方式
  8. rs485接口与计算机,电脑有USB接口就能连接RS485产品了
  9. 微信群二维码活码生成 微信活码
  10. JS中用execCommand(“SaveAs“)保存页面兼容性问题解决方案
  11. 命令提示符 查看已连接Wifi密码(忘记Wifi密码)
  12. 我爱天文 - 月亮从哪边升出来?
  13. 在Windows系统上对hfds中的文件进行操作
  14. 萌新改代码系列(一)--VINS+GPS
  15. MySQL索引 聚集索引
  16. spring boot: Whitelabel Error Page(小白的终极解决方案)
  17. UCOSIII-任务管理
  18. Linux --OSI TCP/IP协议族
  19. 微信小程序自定义输入框个数
  20. 那天,比尔・盖茨差点“砍掉”了这个 160 亿美元的项目:不运行 Windows,是种侮辱...

热门文章

  1. jquery radiobutton使用
  2. Spring3整合Ibatis3配置
  3. 是否使用有硼砂的眼用品
  4. flink读不到kafka数据问题
  5. pyspark的rdd直接写入mysql
  6. datagrip导入csv数据配合ajax+mysql+Flask实验
  7. some understandings about 《Learning representations by back-propagating errors》
  8. python实现最小二乘法(转)
  9. 机器学习(二十三)——Beam Search, NLP机器翻译常用评价度量, 模型驱动 vs 数据驱动
  10. BZOJ 2566 xmastree(树分治+multiset)