调了很久,但没收获
查看原帖
调了很久,但没收获
490484
include13_fAKe楼主2024/7/22 15:00
#include<bits/stdc++.h>
using namespace std;

const int maxn=1e6+10;
const int maxm=1e6+10;
int n,m;
int col[maxm];	//真实的颜色 
int col2[maxm];	//经过处理后的颜色 
int a[maxn];
int ans=0;
vector<int> g[maxm];
void turn(int x,int y){
	for(int i=0;i<g[x].size();i++){
		int now=g[x][i];
//		cout<<now<<endl;
		if(col[col2[now-1]]==y) ans--;
		if(col[col2[now+1]]==y)	ans--;
	}
	for(int i=0;i<g[x].size();i++){
		int now=g[x][i];
		col2[now]=y;
		g[y].push_back(now);
	} 
	while(g[x].size()){
		g[x].pop_back();
	}
//	cout<<g[x].size()<<endl;
	return;
}
void solve(){
	int op;
	scanf("%d",&op);
	if(op==2){
		printf("%d\n",ans);
		return;
	}
	else{
		int x,y;
		scanf("%d%d",&x,&y);
		if(x!=y||!g[x].size()){
			if(g[col[x]].size()>g[col[y]].size()){
				turn(col[y],col[x]);
				col[y]=x;
				col[x]=y;
			}
			else{
				turn(col[x],col[y]);
				col[x]=y;
			}
		}	
		return;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=1e6;i++){
		col[i]=i;
	} 
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]!=a[i-1])	ans++;
		g[a[i]].push_back(i);
		col2[i]=a[i];
	}
	while(m--)	solve();
	return 0;
}

@s_o_t_b

2024/7/22 15:00
加载中...