求助并查集空间?
查看原帖
求助并查集空间?
128870
chen_qian楼主2021/3/15 18:56
#include<bits/stdc++.h>
#define fi first
#define se second
#define N 10005
using namespace std;
int n,m,qwq,fa[N],num[N],size[N];
int get(int x){
	if(x==fa[x]) return x;
	return fa[x]=get(fa[x]);
}
int ans=0,a[5005][5005];
vector<pair<int,int> > v[N<<2];
stack<pair<int,int> > s[N<<2];
void merge(int p,pair<int,int> a){
	int x=get(a.fi);
	int y=get(a.se);
	if(x==y) return ;
	if(size[x]>size[y]) swap(x,y);
	s[p].push(make_pair(x,y));
	ans--;
	fa[x]=y;
	size[y]+=size[x];
}
void del(int p){
	while(!s[p].empty()){
		pair<int,int> x=s[p].top();
		s[p].pop();
		fa[x.fi]=x.fi;
		size[x.se]-=size[x.fi];
		ans++;
	}
}
void modify(int p,int l,int r,int ql,int qr,pair<int,int> x){
	if(ql<=l&&qr>=r){
		v[p].push_back(x);
		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid) modify(p<<1,l,mid,ql,qr,x);
	if(qr>mid) modify(p<<1|1,mid+1,r,ql,qr,x);
}
void query(int p,int l,int r) {
	int sz=v[p].size();
	for(int i=0;i<sz;i++) merge(p,v[p][i]);
	if(l==r) num[l]=ans;
	else{
		int mid=(l+r)>>1;
		query(p<<1,l,mid);
		query(p<<1|1,mid+1,r);
	} 
	del(p);
}
int q[N],cnt;
int main(){
	cin>>n>>m;
	ans=n;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		a[u][v]=a[v][u]=1;
	}
	cin>>qwq;
	for(int i=1;i<=qwq;i++) {
		char c;
		cin>>c;
		if(c=='Q') q[++cnt]=i;
		if(c=='A'){
			int u,v;
			cin>>u>>v;
			a[u][v]=a[v][u]=i;
		}
		if(c=='D'){
			int u,v;
			cin>>u>>v;
			modify(1,1,qwq,a[u][v],i-1,make_pair(u,v));
			a[u][v]=a[v][u]=0;
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<i;j++)
			if(a[i][j]) modify(1,1,qwq,a[i][j],qwq,make_pair(i,j));
	query(1,1,qwq);
	for(int i=1;i<=cnt;i++) cout<<num[q[i]]<<endl; 
	return 0;
}

前三个点MLE,这是怎么做到的?

2021/3/15 18:56
加载中...