您的位置:首页 > 其它

bzoj 1483: [HNOI2009]梦幻布丁

2016-03-13 05:53 267 查看
#include<cstdio>
#include<iostream>
#include<cstring>
#define M 1000008
using namespace std;
int n,next[M],ft[M],m,sum,head[M],st[M],s[M],c[M];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int a1;
scanf("%d",&c[i]);
if(c[i]!=c[i-1])
sum++;
ft[c[i]]=c[i];
if(!head[c[i]])
st[c[i]]=i;
s[c[i]]++;
next[i]=head[c[i]];
head[c[i]]=i;
}
for(int i=1;i<=m;i++)
{
int a1,a2,a3;
scanf("%d",&a1);
if(a1==2)
printf("%d\n",sum);
else
{
scanf("%d%d",&a2,&a3);
if(a2==a3)continue;
if(s[ft[a2]]>s[ft[a3]])
swap(ft[a2],ft[a3]);
int a=ft[a2],b=ft[a3];
if(!s[a])
continue;
s[b]+=s[a];
for(int j=head[a];j;j=next[j])
{
if(c[j+1]==b)
sum--;
if(c[j-1]==b)
sum--;
}
for(int j=head[a];j;j=next[j])
c[j]=b;
next[st[a]]=head[b];
head[b]=head[a];
head[a]=s[a]=st[a]=0;
}
}
return 0;
}


链表合并,启发式合并,由于是启发式合并,所以还要开一个数组记录实际是哪个颜色。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: