社区讨论

求改正代码

P3201[HNOI2009] 梦幻布丁参与者 4已保存回复 29

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
29 条
当前快照
1 份
快照标识符
@lzxytsd8
此快照首次捕获于
2024/08/17 17:58
2 年前
此快照最后确认于
2024/08/17 20:58
2 年前
查看原帖
有没有大佬能帮忙看看
CPP
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
const ll maxn=1000010;
ll now[maxn],color[maxn];
ll ans;
vector<ll> G[maxn];
inline void merge(ll x,ll y) {
	for (ll i=0;i<G[x].size();++i) {
		if (color[G[x][i]+1]==y) ans--;
		if (color[G[x][i]-1]==y) ans--;
	}
	for (ll i=0;i<G[x].size();++i) color[G[x][i]]=y;
	for (ll i=0;i<G[x].size();++i) G[y].push_back(G[x][i]);
	G[x].clear();
}
inline ll in() {
	char a=getchar();
	ll t=0,f=1;
	while(a<'0'||a>'9') {if (a=='-') f=-1;a=getchar();}
	while(a>='0'&&a<='9') {t=(t<<1)+(t<<3)+a-'0';a=getchar();}
	return t*f;
}
signed main() {
	ll n=in(),m=in();
	for (ll i=1;i<=n;++i) {
		color[i]=in();
		now[color[i]]=color[i];
		if (color[i]!=color[i-1]) ans++;
		G[color[i]].push_back(i);
	}
	//	for (int i : G[9]) cout<<i<<" "; 
	for (ll i=1;i<=m;++i) {
		ll opt=in();
		if (opt==2) printf("%lld\n",ans);
		else {
			ll x=in(),y=in();
			if (x==y) continue;
			if (G[x].size()>G[y].size()) {
				merge(now[y],now[x]);
				swap(now[x],now[y]);
			}
			else merge(now[x],now[y]);
		}
	}
	return 0;
}

回复

29 条回复,欢迎继续交流。

正在加载回复...