Description

在遥远的S星系中一共有N个星球,编号为1…N。其中的一些星球决定组成联盟,以方便相互间的交流。但是,组成联盟的首要条件就是交通条件。初始时,在这N个星球间有M条太空隧道。每条太空隧道连接两个星球,使得它们能够相互到达。若两个星球属于同一个联盟,则必须存在一条环形线路经过这两个星球,即两个星球间存在两条没有公共隧道的路径。为了壮大联盟的队伍,这些星球将建设P条新的太空隧道。这P条新隧道将按顺序依次建成。一条新轨道建成后,可能会使一些星球属于同一个联盟。你的任务是计算出,在一条新隧道建设完毕后,判断这条新轨道连接的两个星球是否属于同一个联盟,如果属于同一个联盟就计算出这个联盟中有多少个星球。

Input

第1行三个整数N,M和P,分别表示总星球数,初始时太空隧道的数目和即将建设的轨道数目。

第2至第M+1行,每行两个整数,表示初始时的每条太空隧道连接的两个星球编号。

第M+2行至第M+P+1行,每行两个整数,表示新建的太空隧道连接的两个星球编号。

这些太空隧道按照输入的顺序依次建成。

1≤N,M,P≤200000

Output

输出共P行。

如果这条新的太空隧道连接的两个星球属于同一个联盟,就输出一个整数,表示这两个星球所在联盟的星球数。

如果这条新的太空隧道连接的两个星球不属于同一个联盟,就输出"No"(不含引号)。

Sample Input

5 3 4

1 2

4 3

4 5

2 3

1 3

4 5

2 4

Sample Output

No

3

2

5

HINT

Solution

又是一个LCT的特殊操作——维护边双

其实就是缩点

LCT里真正维护的是那些缩了点之后的联通块的信息,称之为天人交战,与原图中的单个节点毫无关系(除了本身是一个联通块的),它的层次高那么一层

所以每次调用LCT的函数之前,都要先找到它所属的联通块的编号,再用这个编号在LCT里进行操作。那么每次跳节点的时候,要保证操作的节点是在天人层次,每次就跳到那个节点指向的联通块上去

如何记录每个点所属的联通块?用一个类似并查集的东西,记录它指向的联通块

然后在LCT外用一个真正的并查集记录两点的连通性

对于维护联通块,如果 \(u\) , \(v\) 已经联通,再要连上一条边,那肯定就有环了,也就有边双了,那这一个环里的联通块全都要缩起来,那就一个dfs,遍历环里的所有联通块,把他们都指向一个联通块就行了,同时维护题目要求的size

#include<bits/stdc++.h>
#define ll long long
#define db double
#define ld long double
const int MAXN=200000+10;
int n,m,p,fa[MAXN];
#define lc(x) ch[(x)][0]
#define rc(x) ch[(x)][1]
struct LCT{
int ch[MAXN][2],fa[MAXN],rev[MAXN],size[MAXN],stack[MAXN],cnt,bel[MAXN];
inline void init()
{
for(register int i=1;i<=n;++i)bel[i]=i,size[i]=1;
}
inline int find(int x)
{
return bel[x]==x?x:bel[x]=find(bel[x]);
}
inline bool nroot(int x)
{
return lc(find(fa[x]))==x||rc(find(fa[x]))==x;
}
inline void reverse(int x)
{
std::swap(lc(x),rc(x));
rev[x]^=1;
}
inline void dfs(int x,int rt)
{
if(lc(x))dfs(lc(x),rt);
if(rc(x))dfs(rc(x),rt);
if(x!=rt)bel[x]=rt,size[rt]+=size[x];
}
inline void pushdown(int x)
{
if(rev[x])
{
if(lc(x))reverse(lc(x));
if(rc(x))reverse(rc(x));
rev[x]=0;
}
}
inline void rotate(int x)
{
int f=find(fa[x]),p=find(fa[f]),c=(rc(f)==x);
if(nroot(f))ch[p][rc(p)==f]=x;
fa[ch[f][c]=ch[x][c^1]]=f;
fa[ch[x][c^1]=f]=x;
fa[x]=p;
}
inline void splay(int x)
{
cnt=0;
stack[++cnt]=x;
for(register int i=x;nroot(i);i=find(fa[i]))stack[++cnt]=find(fa[i]);
while(cnt)pushdown(stack[cnt--]);
for(register int y=find(fa[x]);nroot(x);rotate(x),y=find(fa[x]))
if(nroot(y))rotate((lc(y)==x)==(lc(find(fa[y]))==y)?y:x);
}
inline void access(int x)
{
for(register int y=0;x;x=find(fa[y=x]))splay(x),rc(x)=y;
}
inline void makeroot(int x)
{
access(x);splay(x);reverse(x);
}
inline void split(int x,int y)
{
makeroot(x);access(y);splay(y);
}
inline void link(int x,int y)
{
makeroot(x);fa[x]=y;
}
};
LCT T;
#undef lc
#undef rc
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline int found(int x)
{
if(fa[x]!=x)fa[x]=found(fa[x]);
return fa[x];
}
inline int add(int u,int v)
{
u=T.find(u),v=T.find(v);
int x=found(u),y=found(v);
if(u==v)return T.size[v];
if(x!=y)
{
fa[x]=y,T.link(u,v);
return -1;
}
T.split(u,v);T.dfs(T.ch[v][0],v);
return T.size[v];
}
int main()
{
read(n);read(m);read(p);
T.init();
for(register int i=1;i<=n;++i)fa[i]=i;
for(register int i=1;i<=m;++i)
{
int u,v;
read(u);read(v);
add(u,v);
}
while(p--)
{
int u,v,res;
read(u);read(v);
if(~(res=add(u,v)))write(res,'\n');
else puts("No");
}
return 0;
}

【刷题】BZOJ 4998 星球联盟的更多相关文章

  1. bzoj 4998 星球联盟

    新技能 get √ :LCT 维护边双连通分量 这题题意就是动态加边,每次求边的两端是否在一个边双连通分量里,输出 "No" 或者边双连通分量的大小 可以用两个并查集分别记录连通性 ...

  2. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  3. 【刷题】BZOJ 4543 [POI2014]Hotel加强版

    Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...

  4. 【刷题】BZOJ 4316 小C的独立集

    Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...

  5. 【刷题】BZOJ 4176 Lucas的数论

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

  6. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

  7. 【刷题】BZOJ 2260 商店购物

    Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...

  8. 【刷题】BZOJ 4566 [Haoi2016]找相同字符

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为 ...

  9. 【刷题】BZOJ 3365 [Usaco2004 Feb]Distance Statistics 路程统计

    Description 在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供 一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的. Input 第1 ...

随机推荐

  1. CHAPTER 24 History of Our Planet 第24章 我们行星的历史

    CHAPTER 24 History of Our Planet 第24章 我们行星的历史 Uncovering the bones of ancient beasts is only part of ...

  2. prometheus-operator 监控 Rabbitmq集群

    首先我们监控服务需要知道prometheus-operator是如何去工作的,才好去写相关的yaml配置,这里我划分成了5个部分,如果容器服务本身就以k8s来编排的,那就只需要三步,这里因为我的rab ...

  3. truffle Dapp 搭建

    安装truffle $ npm install -g truffle 依赖环境 NodeJS 访问https://nodejs.org 官方网站下载安装 系统:Windows, Linux or Ma ...

  4. pycharm连接服务器

    python其他知识目录 1. pycharm当做xshell等远程工具,远程连接服务器步骤: 2.pycharm结合Linux服务器进行代码学习: 2.2使用pycharm远程在服务器上修改和执行代 ...

  5. Vue 入门之数据绑定

    什么是双向绑定? Vue 框架很核心的功能就是双向的数据绑定. 双向是指:HTML 标签数据 绑定到 Vue 对象,另外反方向数据也是绑定的.通俗点说就是,Vue 对象的改变会直接影响到 HTML 的 ...

  6. 兼容所有浏览器的旋转效果-IE滤镜Matrix和CSS3transform

    在现代浏览器中使用CSS3的transform样式即可轻松搞定,但是对于国内IE浏览器(特别是7,8)还占有较大份额的情况下,兼容性还是必须要考虑的,所以也特意记录下IE旋转滤镜的使用. 在IE下的旋 ...

  7. Bing词典vs有道词典比对测试报告——功能篇之辅助功能,差异化功能及软件的效能

    1.辅助功能: 和有道相比,必应的词典加入了换肤功能,用户可以选择喜欢的颜色,而且必应的皮肤也比较多,这一点设计给必应增色不少. 相对而言,有道则加入了调节客户端字体的大小,如下,也比较人性化 2.差 ...

  8. 【CSAPP笔记】14. 异常控制流和进程

    从给处理器加电,到断电为止,处理器做的工作其实就是不断地读取并执行一条条指令.这些指令的序列就叫做 CPU 的控制流(control flow).最简单的控制流是"平滑的",也就是 ...

  9. SM2

    一.介绍 #百度 二.生成密钥对及证书 1.使用gmssl工具 详见gmssl 2.go 版本 详见https://github.com/tjfoc/gmsm 3.java版本 #尚未实现 1.初步使 ...

  10. 团队作业4--第一次项目冲刺2(Alpha版本)

    1.会议 第二次会议: ①:总结第一天任务出现的问题 ②:安排下面两天的任务 2任务安排 3.任务分解图 4.燃尽图 5.适当的项目程序/模块的最新(运行)截图 6.心得 因为做前端的同学并不擅长这方 ...