bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)
1483: [HNOI2009]梦幻布丁
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1818 Solved: 761
[Submit][Status][Discuss]
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
1 2 2 1
2
1 2 1
2
Sample Output
1
【思路】
链表+启发式合并。
每种颜色设一个链表,并记下段数ans。
对于修改,先假设不变,如果左,右不一样则ans--,然后修改颜色值,再遍历一次,如果不一样则ans++,这样就只有因为颜色相同而并成一块的会ans—了。具体修改成哪一个颜色对题目并没有影响,所以采用启发式合并,每次将颜色数少的设为颜色数多的,合并后的总长度一定大于较短的两倍,我们每次都是操作较短的,每次合并长度都会扩大两倍以上最多扩大logn次,时间复杂度为O(nlogn)。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int M = 1e6+; int n,m,a[M],num[M],next[M],front[M],p[M],ans=; int main() {
scanf("%d%d",&n,&m);
memset(front,-,sizeof(front));
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
num[a[i]]++;
}
for(int i=;i<=n;i++){
next[i]=front[a[i]];
front[a[i]]=i;
}
for(int i=;i<=n;i++)
if(a[i]!=a[i-]) ans++;
for(int i=;i<=M-;i++) p[i]=i;
for(int j=;j<=m;j++) {
int op,x,y;
scanf("%d",&op);
if(op==)
printf("%d\n",ans);
else {
scanf("%d%d",&x,&y);
if(x==y) continue;
if(num[p[x]]>num[p[y]]) swap(p[x],p[y]);
x=p[x]; y=p[y];
if(num[x]==) continue;
for(int i=front[x];i!=-;i=next[i]){
if(a[i]!=a[i-]) ans--;
if(a[i]!=a[i+]&&i!=n) ans--;
}
for(int i=front[x];i!=-;i=next[i]) a[i]=y;
int head;
for(int i=front[x];i!=-;i=next[i]) {
if(a[i]!=a[i-]) ans++;
if(a[i]!=a[i+]&&i!=n) ans++;
head=i;
}
num[y]+=num[x]; num[x]=;
next[head]=front[y]; front[y]=front[x];
front[x]=-;
}
}
return ;
}
bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)的更多相关文章
- BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )
把相同颜色的串成一个链表, 然后每次A操作就启发式合并, 然后计算对答案的影响. ----------------------------------------------------------- ...
- BZOJ 1483: [HNOI2009]梦幻布丁 [链表启发式合并]
1483: [HNOI2009]梦幻布丁 题意:一个带颜色序列,一种颜色合并到另一种,询问有多少颜色段 一种颜色开一个链表,每次遍历小的合并到大的里,顺带维护答案 等等,合并方向有规定? 令col[x ...
- bzoj 1483: [HNOI2009]梦幻布丁 (链表启发式合并)
Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input ...
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- 【BZOJ1483】[HNOI2009]梦幻布丁 链表+启发式合并
[BZOJ1483][HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2 ...
- 洛谷P3201 [HNOI2009]梦幻布丁(链表 + 启发式合并)
题目链接 给出 \(n\) 个布丁,每个补丁都有其颜色.现在有 \(m\) 次操作,每次操作将第 \(x_i\) 种颜色全部变为第 \(y_i\) 种颜色. 操作中可能会插入询问,回答目前总共有多少段 ...
- bzoj1483: [HNOI2009]梦幻布丁(链表+启发式合并)
题目大意:一个序列,两种操作. ①把其中的一种数修改成另一种数 ②询问有多少段不同的数如1 2 2 1为3段(1 / 2 2 / 1). 昨晚的BC的C题和这题很类似,于是现学现写居然过了十分开心. ...
- bzoj 1483: [HNOI2009]梦幻布丁 启发式合并vector
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description N个 ...
- bzoj 1483: [HNOI2009]梦幻布丁
1483: [HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1 ...
随机推荐
- VS2010开发环境最佳字体及配色方法
Fixedsys Excelsior 3.01 1. 首先下载字体:http://www.fixedsysexcelsior.com/ 脚本之家字体下载 2. 安装字体:control panel ...
- Siverlight网页应用程序中WCF通信注意事项
最近刚刚接触WCF通信,功能就是客户端点击按钮后,服务器端返回一个随机数字.在VS2010中调试的时候,通信都正常,但发布到IIS7中就没反应了,经过几天的摸索,发现WCF的配置要注意以下两点: 1. ...
- final, finally, finalize的区别
1.final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承. 内部类要访问局部变量,局部变量必须定义成final类型 2.finally是异常处理语句结构的一部分,表示总是执 ...
- 【Scala 】Akka库
简介编辑 Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.9 ...
- CODEVS 1067 机器翻译
题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英 ...
- Codeforces Round #328 div2
Problem_A(592A): 题意: 在一个8*8的棋盘上有黑白两种棋子,'W'代表白色,'B'代表黑色. 玩家A执白子,先走. 白子只能向上走,黑子只能向下走.如果有障碍物则不能走, 比如白色的 ...
- 解决Matlab启动时 " Can't check 9.0 VCRTs The application has failed to start because……" 的错误
注:转载或引用请注明出处 今天在winserver 2012 r2 上安装matlab 2016b , 安装完成运行时提示: ERROR: Cnn't check 9.0 VCRTs <star ...
- hdu 4800 Josephina and RPG
简单dp #include<cstdio> #define maxn 10005 #include<cstring> #include<algorithm> usi ...
- php的curl获取https加密协议请求返回json数据进行信息获取
<?php header("Content-type:text/html; charset=utf-8");function getToken($url){ $ ...
- JAVA 字符串编码总结
java 为了解决跨平台,字符串编码的有点特殊 String newStr = new String(oldStr.getBytes(), "UTF-8");java中的Strin ...