100分Unaccept,Subtask2TLE求助
查看原帖
100分Unaccept,Subtask2TLE求助
495512
Grimgod楼主2022/11/15 15:45
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int w=0,x=0;char ch ;
	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return w?-x:x;
}
int n,m;
int a[5000005];
int	c[5000005];
int siz[5000005];
int head[5000005],to[5000005];
int e[5000005];
int idx;
int cnt;
void add(int place,int k){
	e[idx]=k;
	to[idx]=head[place];
	head[place]=idx++;
	siz[place]++;
}
void update(int &l,int &r){
	if(l==r) return ;
	if(siz[l]>siz[r]) swap(siz[l],siz[r]);
	for(int i=head[l];~i;i=to[i]){
		int now=e[i];
		cnt-=(a[now-1]==r)+(a[now+1]==r);
	}
	for(int i=head[l];~i;i=to[i]){
		int now=e[i];
		a[now]=r;
		if(to[i]==-1){
			to[i]=head[r],head[r]=head[l];
            break;
		}
	}
	head[l]=-1;
	siz[r]+=siz[l];
	siz[l]=0;
}
int g,h,opt;
signed main(){
	memset(head,-1,sizeof(head));
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	for(int i=1;i<=n;i++){
		if(a[i]!=a[i-1]) cnt++;
		add(a[i],i);	
	}
	for(int i=0;i<1e6+5;i++){
		c[i]=i;
	}
	for(int i=1;i<=m;i++){
		opt=read();
		if(opt==2) cout<<cnt<<endl;
		else{
			g=read(),h=read();
			update(c[g],c[h]);
		}
	}
	return 0;
}
2022/11/15 15:45
加载中...