线段树分治85分求调
查看原帖
线段树分治85分求调
993306
ruanshaochuan______楼主2025/7/26 10:44
#include<bits/stdc++.h>
#define ls(p) p<<1
#define rs(p) p<<1|1
using namespace std;
const int maxn=3e5+5;
int f[maxn],ans,l[maxn],r[maxn],n,m,tot,k,pri[maxn*4],siz[maxn],top,tag[maxn*4];
map<pair<int,int>,int>mp;
struct edge{
	int x,y;
}a[maxn],stk[maxn];
vector<int>tree[maxn*5];
void updata(int p,int pl,int pr,int l,int r,int x)
{
	if(l<=pl&&r>=pr)
	{
		tree[p].push_back(x);
		return;
	}
	int mid=(pl+pr)>>1;
	if(l<=mid)
		updata(ls(p),pl,mid,l,r,x);
	if(r>mid)
		updata(rs(p),mid+1,pr,l,r,x);
}
int find(int x)
{
	if(x!=f[x])
		return find(f[x]);
	return x;
}
void dfs(int p,int l,int r)
{
	int t=top;
//	cout<<p<<" "<<l<<" "<<r<<"\n";
	for(int v:tree[p])
	{
		int x=a[v].x,y=a[v].y;
		x=find(x),y=find(y);
		if(x==y)
		{
			tag[++top]=1;
			ans++;
		}else
		{
			if(siz[x]<siz[y])
				swap(x,y);
			f[y]=x;
			siz[x]+=siz[y];
			stk[++top]={x,y};
			tag[top]=0;
		}
	}
	if(l==r)
	{
		pri[l]=ans;
		while(top!=t)
		{
			if(tag[top]==1)
			{
				tag[top]=0;
				ans--;
			}else
			{
				f[stk[top].y]=stk[top].y;
				siz[stk[top].x]-=siz[stk[top].y];
			}
			top--;
		}
		return;
	}
	int mid=(l+r)>>1;
	dfs(ls(p),l,mid);
	dfs(rs(p),mid+1,r);
		while(top!=t)
		{
			if(tag[top]==1)
			{
				tag[top]=0;
				ans--;
			}else
			{
				f[stk[top].y]=stk[top].y;
				siz[stk[top].x]-=siz[stk[top].y];
			}
			top--;
		}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	top=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		if(!mp[{x,y}])
		{
			a[++tot]={x,y+n};
			mp[{x,y}]=tot;
			l[tot]=0;
		}
	}	
	cin>>k;
	for(int i=1;i<=k;i++)
	{
		int x,y;
		cin>>x>>y;
		if(mp[{x,y}])
		{
			r[mp[{x,y}]]=i-1;	
			mp[{x,y}]=0;
			
		}else
		{
			mp[{x,y}]=++tot;
			l[tot]=i;
			a[tot]={x,y+n};
		}
	}
//	cout<<"\n";
	for(int i=1;i<=tot;i++)
	{

		if(r[i]==0)
			r[i]=k;	
//		cout<<l[i]<<" "<<r[i]<<" "<<a[i].x<<" "<<a[i].y<<"\n";
			updata(1,0,k,l[i],r[i],i);
	}
	for(int i=1;i<=2*n;i++)
		f[i]=i;
	dfs(1,0,k);
	for(int i=1;i<=k;i++)
	{
		if(pri[i])
			cout<<"Yes\n";
		else
			cout<<"No\n";
	}
}
2025/7/26 10:44
加载中...