p3201启发式合并模板求助!!玄关
  • 板块灌水区
  • 楼主ChenZQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/27 21:37
  • 上次更新2025/1/28 15:32:18
查看原帖
p3201启发式合并模板求助!!玄关
745358
ChenZQ楼主2025/1/27 21:37

样例全过,提交全错,求助! 我就是用了一个链表维护同一种颜色的位置,然后用并查集维护原来的位置现在的颜色,用id表示一个指针也就是链表头的位置

#include <bits/stdc++.h>
using namespace std;

const int N = 2000010;
int h[N],e[N],ne[N],idx=1;
int ans=0;
int tl[N];
int f[N];
int n,m,id[N];
int c[N],sz[N];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void merge(int x,int y)
{
	for(int i=h[id[x]];i!=-1;i=ne[i])
	{
		ans-=(find(f[c[e[i]-1]])==y)+(find(f[c[e[i]+1]])==y);
	//	cout<<e[i]<<" "<<find(f[c[e[i]-1]])<<endl;
	}
	ne[tl[y]]=h[id[x]],tl[y]=tl[id[x]];
	h[id[x]]=-1,sz[id[x]]=0;
}
int main()
{
	scanf("%d%d",&n,&m);
	memset(h,-1,sizeof h);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&c[i]);
		id[c[i]]=c[i];
		f[c[i]]=c[i];
		if(c[i]!=c[i-1]) ans++;
		if(h[c[i]]==-1)
		{
			h[c[i]]=idx;
			tl[c[i]]=idx;
			ne[idx]=-1;e[idx]=i;
			idx++;sz[c[i]]++;
			continue;
		}
		e[idx]=i;
		ne[tl[c[i]]]=idx;
		ne[idx]=-1;
		tl[c[i]]=idx++;
		sz[c[i]]++;
	}
	while(m--)
	{
		int op,a,b;
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d",&a,&b);
			if(f[a]==f[b]) continue;
			if(sz[id[a]]>sz[id[b]]) swap(id[a],id[b]),swap(a,b);
			if(sz[a]==0 || a==b) continue;
			merge(a,b);
			f[find(a)]=find(b);
		}
		else printf("%d\n",ans);
	}
}
2025/1/27 21:37
加载中...