BZOJ 1483 [HNOI 2009] 启发式合并链表 解题报告
来源:互联网 发布:网络贷被全面叫停政策 编辑:程序博客网 时间:2024/06/05 08:44
1483: [HNOI2009]梦幻布丁
Description
N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色.
Input
第一行给出N,M表示布丁的个数和好友的操作次数. 第二行N个数A1,A2…An表示第i个布丁的颜色从第三行起有M行,对于每个操作,若第一个数字是1表示要对颜色进行改变,其后的两个整数X,Y表示将所有颜色为X的变为Y,X可能等于Y. 若第一个数字为2表示要进行询问当前有多少段颜色,这时你应该输出一个整数. 0
Output
针对第二类操作即询问,依次输出当前有多少段颜色.
Sample Input
4 3
1 2 2 1
2
1 2 1
2
Sample Output
3
1
【解题报告】
求出初始序列的ans,然后每次修改颜色相当于合并两个颜色,启发式合并。
代码如下:
/************************************************************** Problem: 1483 User: onepointo Language: C++ Result: Accepted Time:452 ms Memory:20372 kb****************************************************************/#include<cstdio>#include<algorithm>#define N 1001001using namespace std;int cnt=0,n,m,ans=0;int a[N],head[N],next[N],sz[N],f[N];void insert(int k){ next[++cnt]=head[k]; head[k]=cnt;}void merge(int x,int y){ if(x==y) return; if(sz[f[x]]>sz[f[y]]) swap(f[x],f[y]); x=f[x];y=f[y]; int t; if(head[x]==0) return; for(t=head[x];t;t=next[t]) { if(a[t+1]==y) ans--; if(a[t-1]==y) ans--; } for(t=head[x];t;t=next[t]) a[t]=y; for(t=head[y];next[t];t=next[t]); next[t]=head[x];sz[y]+=sz[x];sz[x]=0; head[x]=0;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { scanf("%d",&a[i]); if(a[i]!=a[i-1]) ans++; insert(a[i]); sz[a[i]]++;f[a[i]]=a[i]; } for(int i=1;i<=m;++i) { int d,x,y; scanf("%d",&d); if(d==1) scanf("%d%d",&x,&y),merge(x,y); else printf("%d\n",ans); } return 0;}
阅读全文
0 0
- BZOJ 1483 [HNOI 2009] 启发式合并链表 解题报告
- BZOJ 1483 HNOI 2009 梦幻布丁 链表+启发式合并
- BZOJ 2733 [HNOI 2012] 线段树合并 解题报告
- BZOJ 2733 HNOI 2012 永无乡 平衡树启发式合并
- 【BZOJ 2733】【HNOI 2012】永无乡【treap启发式合并】
- BZOJ 1483: [HNOI2009]梦幻布丁 启发式合并链表
- BZOJ 1483: [HNOI2009]梦幻布丁 启发式合并 邻接表活用
- BZOJ 1598 [Usaco 2008 Mar] 启发式搜索 解题报告
- BZOJ 1483: [HNOI2009]梦幻布丁 链表或者平衡树启发式合并
- bzoj 1438(启发式合并)
- bzoj 4565 字符合并 DP 解题报告
- bzoj 2733(splay启发式合并)
- bzoj 2733 splay+启发式合并
- BZOJ 1483 HNOI 2009 梦幻布丁
- BZOJ 1483|HNOI 2009|梦幻布丁|Set
- BZOJ 1483 HNOI2009 梦幻布丁 链表+启发式合并
- BZOJ 1483 [HNOI2009]梦幻布丁(启发式合并)
- [平衡树 启发式合并] BZOJ 1483 [HNOI2009]梦幻布丁
- 一种相对高效的按键消抖方法
- Leetcode28. kmp算法实现字符串匹配
- FastDFS(1)5.12安装步骤
- php引用传值与传值赋值的copy on write,简单底层原理
- Qt 之 模仿 QQ登陆界面——样式篇
- BZOJ 1483 [HNOI 2009] 启发式合并链表 解题报告
- Python 统计文件相同字段次数
- python 自动批量安装apk并抓取日志
- LInux配置
- Docker容器技术介绍(二) --- Docker镜像操作
- Java 资源文件路径详解(getResource)
- POJ1419 Graph Coloring
- 网站页面title标题的设置方法技巧
- JavaScript --01 引言