并查集爆零
查看原帖
并查集爆零
375953
Lgx_Q楼主2023/1/26 20:44
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10,mod=1e9+7;
ll n,m,k,x,y,l,r,d[maxn],siz[maxn],top,ans[maxn];
vector<pair<ll,ll> >edge[maxn];
pair<ll,ll> stk[maxn];
void modify(ll p,ll l,ll r,ll ql,ll qr,pair<ll,ll>pa)
{
	if(ql<=l&&r<=qr)
	{
		edge[p].push_back(pa);
		return;
	}
	ll mid=l+r>>1;
	if(ql<=mid) modify(p<<1,l,mid,ql,qr,pa);
	if(mid<qr) modify(p<<1|1,mid+1,r,ql,qr,pa);
}
ll find(ll x)
{
	if(d[x]==x) return x;
	return find(d[x]);
}
bool merge(pair<ll,ll>pa)
{
	ll x=pa.first,y=pa.second;
	x=find(x); y=find(y);
	if(x==y) return false;
	stk[++top]=pa;
	if(siz[x]>siz[y])
	{
		d[y]=x;
		siz[x]+=siz[y];
	}
	else
	{
		d[x]=y;
		siz[y]+=siz[x];
	}
	return true;
}
void split()
{
	ll x=stk[top].first,y=stk[top].second;
	--top;
	if(d[x]==y)
	{
		siz[y]-=siz[x];
		d[x]=x;
	}
	else
	{
		siz[x]-=siz[y];
		d[y]=y;
	}
}
void dfs(ll p,ll l,ll r)
{
	for(ll i=0;i<edge[p].size();i++)
	{
		if(!merge(edge[p][i]))
		{
			while(i--)
			{
				split();
			}
			return;
		}
	}
	if(l==r)
	{
		ans[l]=1;
	}
	else
	{
		ll mid=l+r>>1;
		dfs(p<<1,l,mid);
		dfs(p<<1|1,mid+1,r);
	}
	for(ll i=0;i<edge[p].size();i++) split();
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&k);
	for(ll i=1;i<=n*2;i++) d[i]=i,siz[i]=1;
	for(ll i=1;i<=m;i++)
	{
		ll x,y,l,r;
		scanf("%lld%lld%lld%lld",&x,&y,&l,&r);
		++l;
		if(l>r) continue;
		modify(1,1,k,l,r,make_pair(x,y+n));
		modify(1,1,k,l,r,make_pair(x+n,y));
	}
	dfs(1,1,k);
	for(ll i=1;i<=k;i++)
		if(ans[i]) printf("Yes\n");
		else printf("No\n");
	return 0;
}
2023/1/26 20:44
加载中...