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; }
链表合并,启发式合并,由于是启发式合并,所以还要开一个数组记录实际是哪个颜色。
相关文章推荐
- 71.双向最短路径:聚会
- 71.双向最短路径:聚会
- [leetcode] 245. Shortest Word Distance III 解题报告
- bzoj 1433: [ZJOI2009]假期的宿舍
- bzoj 1432: [ZJOI2009]Function
- bzoj 1415: [Noi2005]聪聪和可可
- bzoj 1412: [ZJOI2009]狼和羊的故事
- Palindrome 系列
- 谷歌人机大战与新时代的来临
- 工厂模式之小结与区别(6)
- 抽象工厂模式(5)
- 抽象工厂模式(4)
- leetcode@ [116/117] Populating Next Right Pointers in Each Node I & II (Tree, BFS)
- !getApplicationContext()和Activity.this区别
- 【Android】20.4 录音
- MarkDown的简介
- 【Android】20.3 拍照和视频录制
- python中一些常用的module小结
- Jquery Ajax 跨域之JSONP方式极简示例,服务端是.net的ashx
- [leetcode] 311. Sparse Matrix Multiplication 解题报告