题面

传送门

题解

总算有自己的\(bzoj\)账号啦!

话说这题好像\(Scape\)去年暑假就讲过……然而我到现在才会……

\(LCT\)什么的跑得太慢了而且我也不会,所以这里是一个并查集的做法

首先题目意思就是要我们动态维护点双

我们离线,先求出一个森林,并且要使用编号尽量小的边

连上一条边的时候,如果它们还没有联通,那么显然答案是\(No\)

如果已经联通,那么它们这棵树的路径上所有点都会被缩进同一个点双里。暴力的话复杂度显然爆炸

我们另外开一个并查集\(ga\),表示\(i\)所在的边双中深度最小的点,那么每次路径缩点的时候只要改所有边双的深度最小点就可以了

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){
if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=5e5+5;
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
struct EG{int u,v,is;}st[N];
int fa[N],ga[N],sz[N],dep[N],q[N];
int n,m,p;
int find(int x){return ga[x]==x?x:ga[x]=find(ga[x]);}
void bfs(int u){
int h=1,t=0;q[++t]=u,dep[u]=1;
while(h<=t){
u=q[h++];
go(u)if(v!=fa[u])fa[v]=u,dep[v]=dep[u]+1,q[++t]=v;
}
}
void merge(int u,int v){
u=find(u),v=find(v);
while(u!=v){
if(dep[u]<dep[v])swap(u,v);
sz[find(fa[u])]+=sz[u],u=ga[u]=ga[fa[u]];
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),p=read();
fp(i,1,n)ga[i]=i;
for(R int i=1,u,v;i<=m+p;++i){
u=read(),v=read(),st[i].u=u,st[i].v=v,u=find(u),v=find(v);
if(u!=v)ga[u]=v,st[i].is=1,add(st[i].u,st[i].v),add(st[i].v,st[i].u);
}
fp(i,1,n)if(!dep[i])bfs(i);
fp(i,1,n)sz[i]=1,ga[i]=i;
fp(i,1,m)if(!st[i].is)merge(st[i].u,st[i].v);
fp(i,m+1,m+p)if(st[i].is)sr[++K]='N',sr[++K]='o',sr[++K]='\n';
else merge(st[i].u,st[i].v),print(sz[find(st[i].u)]);
return Ot(),0;
}

【bzoj4998】星球联盟(并查集+边双)的更多相关文章

  1. bzoj4998 星球联盟

    bzoj4998 星球联盟 原题链接 题解 先按照输入顺序建一棵树(森林),然后用一个并查集维护联盟的关系,对于不是树上的边\(a-b\),就把\(a-lca(a,b),b-lca(a,b)\)全部合 ...

  2. BZOJ4998星球联盟——LCT+并查集(LCT动态维护边双连通分量)

    题目描述 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成 联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两 ...

  3. BZOJ4998 星球联盟(LCT+双连通分量+并查集)

    即要求动态维护边双.出现环时将路径上的点合并即可.LCT维护.具体地,加边成环时makeroot+access+splay一套把这段路径提出来,暴力dfs修改并查集祖先,并将这部分与根断开,视为删除这 ...

  4. bzoj4998 星球联盟 LCT + 并查集

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4998 题解 根据题意,就是要动态维护点双,求出一个点双的权值和. 所以这道题就是和 bzoj2 ...

  5. bzoj2959: 长跑 LCT+并查集+边双联通

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2959 题解 调了半天,终于调完了. 显然题目要求是求出目前从 \(A\) 到 \(B\) 的可 ...

  6. bzoj4998: 星球联盟(link-cut-tree)

    题面 bzoj 题解 bzoj2959: 长跑的弱化版 产生了环就并查集维护一下 Code #include<bits/stdc++.h> #define LL long long #de ...

  7. BZOJ 2959: 长跑 lct 双联通分量 并查集 splay

    http://www.lydsy.com/JudgeOnline/problem.php?id=2959 用两个并查集维护双联通分量的编号和合并. #include<iostream> # ...

  8. 【NOIP2017练习&BZOJ4998】星球联盟(强联通分量,并查集)

    题意: 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个 ...

  9. 【bzoj4998】星球联盟 LCT+并查集

    题目描述 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个 ...

随机推荐

  1. 读取Excel里面的内容转为DataTable

    using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using Sy ...

  2. MVC各层的职责

    Model(模型):模型代表着核心的业务逻辑和数据(不要理解成Model只是实体类) View(视图):视图应该关注与如何展示数据,而不应该包含任何业务逻辑(业务逻辑应写在Model中) Contro ...

  3. DataGuard的cascading standby(1拖N的模式)

    在Oracle11.2.0.2版本后,dataguard支持级联模式传输日志,即日志传输可以从A到B,B到C,B到D,等等,无穷无尽 cascading standby可以分担主库传输日志到多个备库的 ...

  4. [模板]LIS(最长上升子序列)

    转载自:最长上升子序列(LIS)长度的O(nlogn)算法 最长上升子序列nlogn算法 在川大oj上遇到一道题无法用n^2过于是,各种纠结,最后习得nlogn的算法 最长递增子序列,Longest ...

  5. 4款APP原型设计工具助你搞定移动应用设计!

    随着信息化社会的不断发展,不仅手机迭代更新的速度飞快,就连手机里的App 也层出不穷.作为一名UI/UX设计师或产品经理,如何才能设计一款出色的移动App?光有好的创意是不够的,你还需要一款正确的Ap ...

  6. CoreImage

    [CoreImage] CIContext is an object through which Core Image draws the results produced by a filter. ...

  7. Text Relatives II

    [Text Relatives II] When your app determines that the user has requested the edit menu—which could b ...

  8. 借用服务器百度BAE

    3一.简介 对于普通的开发者,不必要买服务器和买域名,这时要将自己的项目传到服务器上,就用到了百度BAE这样的,可以直接传项目的服务器. 二.申请 登录百度开放平台上 三.登录网址,选择要使用的项目 ...

  9. WCF Service 配置文件注释(转)

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.S ...

  10. CodeForces 572D Minimization(DP)

    题意翻译 给定数组AAA 和值kkk ,你可以重排AAA 中的元素,使得∑i=1n−k∣Ai−Ai+k∣\displaystyle\sum_{i=1}^{n-k} |A_i-A_{i+k}|i=1∑n ...