求助此题WA4-10
查看原帖
求助此题WA4-10
233815
zhjzhmh楼主2023/2/20 22:17

RT

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,Q,tot,c,f[5010],sz[5010],a[5010][5010],q[5010],ans[5010],top,x,y;
struct node{int x,y;}st[1600100];
vector< pair<int,int> > t[1600010];
char ch;
int find(int x) {return f[x]==x?x:find(f[x]);}
void unionn(int x,int y)
{
	int fx=find(x),fy=find(y);
	if(fx==fy) {st[++top]=(node){-1,-1};return;}
	c--;if(sz[fx]>sz[fy]) swap(fx,fy);
	f[fx]=fy;sz[fy]+=sz[fx];
	st[++top]=(node){fx,fy};
}
void change(int x,int l,int r,int L,int R,pair<int,int> p)
{
	if(l>R||r<L) return;
	if(L<=l&&r<=R) {t[x].push_back(p);return;}
	int mid=(l+r)/2;change(x<<1,l,mid,L,R,p);change(x<<1|1,mid+1,r,L,R,p);
}
void del()
{
	int x=st[top].x,y=st[top].y;top--;
	if(x==-1) return;
	c++;f[x]=x;sz[y]-=sz[x];
}
void query(int x,int l,int r)
{
	if(!t[x].empty()) for(int i=0;i<t[x].size();i++) unionn(t[x][i].first,t[x][i].second);
	if(l==r) ans[l]=c;
	else {int mid=(l+r)/2;query(x<<1,l,mid);query(x<<1|1,mid+1,r);}
	int s=t[x].size();while(s--) del();
}
signed main()
{
	cin>>n>>m;c=n;
	for(int i=1;i<=m;i++) scanf("%lld%lld",&x,&y),a[x][y]=a[y][x]=1;
	cin>>Q;
	for(int i=1;i<=Q;i++)
	{
		cin>>ch;
		if(ch=='Q') q[++tot]=i;
		if(ch=='A') scanf("%lld%lld",&x,&y),a[x][y]=a[y][x]=i;
		if(ch=='D') scanf("%lld%lld",&x,&y),change(1,1,Q,a[x][y],i-1,make_pair(x,y)),a[x][y]=a[y][x]=0;
	}
	for(int i=1;i<=n;i++)
	  for(int j=1;j<i;j++)
	    if(a[i][j])
	      change(1,1,Q,a[i][j],Q,make_pair(i,j));
	for(int i=1;i<=n;i++) f[i]=i,sz[i]=i;
	query(1,1,Q);
	for(int i=1;i<=tot;i++) printf("%lld\n",ans[q[i]]);
}

后面点输出为负,但是开了 longlonglonglong

2023/2/20 22:17
加载中...