傳送門php
總算有本身的\(bzoj\)帳號啦!c++
話說這題好像\(Scape\)去年暑假就講過……然而我到如今纔會……spa
\(LCT\)什麼的跑得太慢了並且我也不會,因此這裏是一個並查集的作法code
首先題目意思就是要咱們動態維護點雙get
咱們離線,先求出一個森林,而且要使用編號儘可能小的邊it
連上一條邊的時候,若是它們尚未聯通,那麼顯然答案是\(No\)class
若是已經聯通,那麼它們這棵樹的路徑上全部點都會被縮進同一個點雙裏。暴力的話複雜度顯然爆炸test
咱們另外開一個並查集\(ga\),表示\(i\)所在的邊雙中深度最小的點,那麼每次路徑縮點的時候只要改全部邊雙的深度最小點就能夠了di
//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; }