wa 60pts 启发式合并求条
查看原帖
wa 60pts 启发式合并求条
1268457
20090818Cc楼主2025/6/22 21:50

rt,谢谢啦~

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int M=1e6+110;
inline int read(){
	int sum=0,k=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')k=-1;c=getchar();
	}while(c>='0'&&c<='9'){sum=sum*10+c-48;c=getchar();
	}return sum*k;
}
vector<int>a[M];
inline void Adde(int u,int v){
	a[u].push_back(v);
}
int n=0,m=0,res=0;
int f[M],co[M],siz[M];
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		co[i]=read();
		siz[co[i]]++;
		Adde(co[i],i);
		f[co[i]]=co[i];
		if(co[i]!=co[i-1]) res++;
	}
	for(int i=1;i<=m;i++){
		int op=read();
		if(op==1){
			int x=read(),y=read();
			if(x==y) continue;
			if(siz[f[x]]==siz[f[y]]&&siz[f[x]]==0) continue;
			if(siz[f[x]]>siz[f[y]]){
				for(auto v:a[f[y]]){
					Adde(f[x],v);
					if(co[v-1]==f[x]) res--;
					if(co[v+1]==f[x]) res--;
				}
				for(auto v:a[f[y]]){
					co[v]=f[x];
				}
				siz[f[x]]+=siz[f[y]];
				siz[f[y]]=0;
				f[y]=f[x];
//				a[f[y]].clear();
				continue;
			}
			else{
				for(auto v:a[f[x]]){
					Adde(f[y],v);
					if(co[v-1]==f[y]) res--;
					if(co[v+1]==f[y]) res--;
				}
				for(auto v:a[f[x]]){
					co[v]=f[y];
				}
				siz[f[y]]+=siz[f[x]];
				siz[f[x]]=0;
				f[x]=f[y];
//				a[f[x]].clear();
				continue;
			}
		}
		if(op==2){
			printf("%lld\n",res);
			continue;
		} 
	}
	return 0;
}
2025/6/22 21:50
加载中...