样例全过,提交全错,求助! 我就是用了一个链表维护同一种颜色的位置,然后用并查集维护原来的位置现在的颜色,用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);
}
}