[CF576E] Painting Edges 题解

模版题的升级了。

使用二分图经典判定方法(一个点拆成两个点 \(x,x+n\),连边 \((x,y)\) 就是连接 \((x,y+n),(x+n,y)\),那么是否是二分图就等价于判断 \(x,x+n\) 是否都不在一个集合内),预处理出每个操作的 \(e_i\) 下一次出现的位置 \(nx_i\),每一次修改边相当于给 \((i,nx_i)\) 这个区间内的 \(c_i\) 颜色加了 \(e_i\) 这条边,那就是经典线段树分治了。

时间复杂度 \(O(n\log^2n\log k)\)

#include<bits/stdc++.h>
using namespace std;
const int N=5e7+5,M=5e5+5;
int n,m,k,fa[N],sz[N],xc[M],yc[M];
int q,ls[M],nx[M],eg[M],c[M],lc[M];
inline int idx(int x,int cl){
	return (cl-1)*2*n+x;
}struct mer{
	int sz,x,y;
};stack<mer>st;
struct ed{
	int x,y;
};vector<ed>g[4*M];
inline void init(){
	for(int i=1;i<=2*n*k;i++)
		fa[i]=i,sz[i]=1;
}inline int find(int x){
	return fa[x]==x?x:find(fa[x]);
}inline void unite(int x,int y){
	x=find(x),y=find(y);
	if(x==y) return;
	if(sz[x]<sz[y]) swap(x,y);
	st.push({sz[x],x,y});
	fa[y]=x,sz[x]+=sz[y];
}inline void chg(int x,int l,int r,int L,int R,ed e){
	if(L>R) return;
	if(L<=l&&r<=R){
		g[x].push_back(e);
		return;
	}int mid=(l+r)/2;
	if(L<=mid) chg(x*2,l,mid,L,R,e);
	if(R>mid) chg(x*2+1,mid+1,r,L,R,e);
}inline void solve(int x,int l,int r){
	int ans=1,ltp=st.size();
	for(auto e:g[x]) unite(e.x,e.y);
	int mid=(l+r)/2;
	if(l!=r){
		solve(x*2,l,mid);
		solve(x*2+1,mid+1,r);
	}else{
		int xa=idx(xc[eg[l]],c[l]);
		int ya=idx(yc[eg[l]],c[l]);
		int xb=idx(xc[eg[l]]+n,c[l]);
		int yb=idx(yc[eg[l]]+n,c[l]);
		int xl=idx(xc[eg[l]],lc[eg[l]]);
		int yl=idx(yc[eg[l]],lc[eg[l]]);
		int xr=idx(xc[eg[l]]+n,lc[eg[l]]);
		int yr=idx(yc[eg[l]]+n,lc[eg[l]]);
		if(find(xa)==find(ya)){
			if(lc[eg[l]]){
				chg(1,1,q,l+1,nx[l],{xl,yr});
				chg(1,1,q,l+1,nx[l],{xr,yl});
			}cout<<"NO\n";
		}else{
			cout<<"YES\n",lc[eg[l]]=c[l];
			chg(1,1,q,l+1,nx[l],{xa,yb});
			chg(1,1,q,l+1,nx[l],{xb,ya});
		}
	}while(st.size()>ltp){
		mer x=st.top();st.pop();
		fa[x.y]=x.y,sz[x.x]=x.sz;
	}
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>k>>q,init();
	for(int i=1;i<=m;i++)
		cin>>xc[i]>>yc[i];
	for(int i=1;i<=q;i++){
		cin>>eg[i]>>c[i];
		nx[ls[eg[i]]]=i-1;
		nx[ls[eg[i]]=i]=q;
	}solve(1,1,q);
	return 0;
}
posted @ 2024-12-08 16:59  长安一片月_22  阅读(2)  评论(0编辑  收藏  举报