[HNOI2009]梦幻布丁 算法技巧之邻接链
题目描述
N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色.
输入输出格式
输入格式:
第一行给出N,M表示布丁的个数和好友的操作次数. 第二行N个数A1,A2...An表示第i个布丁的颜色从第三行起有M行,对于每个操作,若第一个数字是1表示要对颜色进行改变,其后的两个整数X,Y表示将所有颜色为X的变为Y,X可能等于Y. 若第一个数字为2表示要进行询问当前有多少段颜色,这时你应该输出一个整数. 0
输出格式:
针对第二类操作即询问,依次输出当前有多少段颜色.
输入输出样例
4 3
1 2 2 1
2
1 2 1
2
3
1
说明
1<=n,m<=100,000; 0<Ai,x,y<1,000,000
首先上网络上的题解:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<stack>
#include<ctime>
using namespace std;
const int maxn=;
int n,m,ans;
int s[maxn],//每一个颜色的个数
Next[maxn],//邻接链
head[maxn],//邻接链
map[maxn],//存图
dp[maxn],//当前位置的实际颜色
first[maxn];//某颜色第一次出现的位置
void solve(int a,int b)
{
for(int i=head[a];i!=-;i=Next[i])
{
if(map[i+]==b)ans--;//更改颜色后与后方颜色相同,ans--
if(map[i-]==b)ans--;//更改颜色后与前方颜色相同,ans--
}//计算对结果的影响
for(int i=head[a];i!=-;i=Next[i])map[i]=b;//更改颜色
Next[first[a]]=head[b];head[b]=head[a];s[b]+=s[a];
head[a]=first[a]=s[a]=;//将两个邻接链合并,只需更改后继顺序即可
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
memset(head,-,sizeof(head));
for(i=;i<=n;i++)
{
scanf("%d",&map[i]);
dp[map[i]]=map[i];
if(map[i]!=map[i-])ans++;
if(head[map[i]]==-)first[map[i]]=i;
s[map[i]]++;
Next[i]=head[map[i]];
head[map[i]]=i;
}//输入,赋初值 ,创建邻接链
for(i=;i<=m;i++)
{
int a,b,x;
scanf("%d",&x);
if(x==)printf("%d\n",ans);
else
{
scanf("%d%d",&a,&b);
if(a==b)continue;
if(s[dp[a]]>s[dp[b]])
swap(dp[a],dp[b]);
a=dp[a];b=dp[b];
//dp数组的意义在于每次都是选颜色相对少的集合进行合并以提高效率,但由于之后可能会有与这个颜色
//相关的变换所以需要一个数组来维护当前颜色对应的实际颜色
if(s[a]==)continue;
s[b]+=s[a];s[a]=;
solve(a,b);
}
}
return ;
}
[HNOI2009]梦幻布丁 算法技巧之邻接链的更多相关文章
- bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1818 Solved: 761[Submit][Status ...
- BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )
把相同颜色的串成一个链表, 然后每次A操作就启发式合并, 然后计算对答案的影响. ----------------------------------------------------------- ...
- BZOJ 1483: [HNOI2009]梦幻布丁 [链表启发式合并]
1483: [HNOI2009]梦幻布丁 题意:一个带颜色序列,一种颜色合并到另一种,询问有多少颜色段 一种颜色开一个链表,每次遍历小的合并到大的里,顺带维护答案 等等,合并方向有规定? 令col[x ...
- [HNOI2009] 梦幻布丁
[HNOI2009] 梦幻布丁 标签: 链表 题解 可以直接用链表启发式合并做. 合并的细节处理稍微有点麻烦. 假如需要变成另一种颜色的那个颜色的个数更多,那么就肯定不能直接合. 维护一个color数 ...
- bzoj 1483: [HNOI2009]梦幻布丁 启发式合并vector
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description N个 ...
- 1483: [HNOI2009]梦幻布丁
1483: [HNOI2009]梦幻布丁 链接 分析: 启发式合并+链表. 代码: #include<cstdio> #include<algorithm> #include& ...
- 洛谷 3201 [HNOI2009]梦幻布丁 解题报告
3201 [HNOI2009]梦幻布丁 题目描述 \(N\)个布丁摆成一行,进行\(M\)次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为\(1,2,2 ...
- bzoj 1483: [HNOI2009]梦幻布丁
1483: [HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1 ...
- BZOJ 1483:[HNOI2009]梦幻布丁(链表+启发式合并)
[HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一 ...
随机推荐
- 工具类总结---(五)---SD卡文件管理
里面注释很清楚了... package cgjr.com.cgjr.utils; import android.content.Context; import android.graphics.Bit ...
- linux下vim编辑器使用
VIM - Vi IMproved: vim是vi编辑器的升级版,是linux下标准的编辑器,具有程序编写能力,可以根据字体颜色辨别语法的正确性,方便程序的设计. 使用: # vim [OPTION] ...
- 【源码学习】之requirejs
对于现在的前端生态来说,requirejs是有点过时了,webpack帮我们包干了一切.但是对于学习源码这件事情来说,永远是不过时的! 最近稍微闲下来了一点,就着以前做过的项目,我也来看看requir ...
- 学习笔记:javascript 表单对象(form)
Form 对象属性 属性 描述 acceptCharset 服务器可接受的字符集. action 设置或返回表单的 action 属性. enctype 设置或返回表单用来编码内容的 MIME 类型. ...
- 常用的CI笔记
1. thinkphp 封装好的$this->success(),就直接实现成功跳转,$this->error(),错误跳转.CI有show_error(),但是却不能直接实现跳转,所以需 ...
- 跟随上次的socket sever,追加Tcplistener、Httplistener的server
一.Tcplistener搭建web server 1.同socket类似,Tcplistener其实是对socket的封装,方便编程,先初始化tcplistener并且开始监听 //初始化端点信息 ...
- 【JAVAWEB学习笔记】24_filter实现自动登录和解决全局的编码问题
过滤器Filter 学习目标 案例-自动登录 案例-解决全局的编码 一.过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标 ...
- 扫描soa并输出所有服务方法
现在,大多公司都采用soa架构.那么我们怎么知道soa提供哪些服务方法呢?是通过浏览器不断的点击尝试?还是通过wcf?还是通过阅读soa接口文档,在软件开发行业,总会有文档落后于代码的情况?这些手法都 ...
- 1.Java 加解密技术系列之 BASE64
Java 加解密技术系列之 BASE64 序号 背景 正文 总结 序 这段时间,工作中 用到了 Java 的加解密技术,本着学习的态度,打算从这篇文章开始,详细的研究一番 Java 在加解密技术上有什 ...
- JQuery操作表单控件
1.jquery操作radio <html> <head> <script type="text/javascript" src="jq ...