P3201 [HNOI2009] 梦幻布丁 启发式合并
P3201 [HNOI2009] 梦幻布丁
考察:启发式合并,set
思路:
这种不可逆的改变都应该采用启发式合并,即把集合大小小的合并到大的去。那么要统计cnt,遍历小的集合中的每个元素,它前面的那个也在集合y里就cnt–,同理它后面的那个如果也在集合y里就cnt–.
STL set用法
此处用到:
(1)swap() : 交换 2 个 set 容器中存储的所有元素。这意味着,操作的 2 个 set 容器的类型必须相同。
(2)count(val) :在当前 set 容器中,查找值为 val 的元素的个数,并返回。注意,由于 set 容器中各元素的值是唯一的,因此该函数的返回值最大为 1。
(3)clear() :清空 set 容器中所有的元素,即令 set 容器的 size() 为 0。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int n,m,cnt,a[N];
set<int> s[N];//设置集合 int main(){scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]!=a[i-1]) cnt++;//先记录连续颜色段数,如果这个和前面的颜色不同,cnt+1 s[a[i]].insert(i);//将序号加入相应颜色中 }int opt,x,y;while(m--){scanf("%d",&opt);if(opt==1){scanf("%d %d",&x,&y);if(x == y) continue;//如果颜色不变,就不用管了 //启发式合并:把秩小的集合合并到大的集合去 if(s[x].size() > s[y].size()) swap(s[x] , s[y]);//先将x集合变成小的那个,再合并到y去 for(set<int>::iterator it = s[x].begin(); it != s[x].end();++it){ //遍历集合x,这个元素的前一个和后一个在集合y里都要减1 //set中的count函数:如果集合中包含这个元素返回1,否则返回0 cnt-=(s[y].count(*it - 1) + s[y].count(*it + 1)) ; //这是更新cnt }for(set<int>::iterator it = s[x].begin(); it != s[x].end();++it){s[y].insert(*it);//将 x合并到y }s[x].clear();//被合并了,要清空 }else if(opt == 2){printf("%d\n",cnt);}}return 0;
}
P3201 [HNOI2009] 梦幻布丁 启发式合并相关推荐
- P3201 [HNOI2009]梦幻布丁 [启发式合并][set]
P3201 [HNOI2009]梦幻布丁 题意:N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3 ...
- ac 梦幻布丁 启发式合并
题意:中文题. 对于每种颜色,我们都可以看成一个集合.让后把一种颜色变成另一种颜色就转换成了把两个集合的合并问题.显然我们有一个复杂度为O(NlogN)O(NlogN)O(NlogN)的启发式合并能完 ...
- 链表+启发式合并(bzoj 1483: [HNOI2009]梦幻布丁)
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3323 Solved: 1304 [Submit][Sta ...
- 【bzoj1486】【[HNOI2009]梦幻布丁】启发式链表合并(详解)
(画师当然是武内崇啦) Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3 ...
- 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁
Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第 ...
- [HNOI2009]梦幻布丁
题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 第一行给出N,M表示布丁的个 ...
- 【金牌导航】【洛谷 P3201】【启发式合并】梦幻布丁
[金牌导航][洛谷 P3201][启发式合并]梦幻布丁 题目 解题思路 启发式合并真的就是想到挺难的,想到后简单得很 如何判断有几段还是很容易的,如果和前一个布丁颜色不同,段数+1 将每一种颜色看作一 ...
- P3201-[HNOI2009]梦幻布丁【启发式合并,链表】
正题 题目链接:https://www.luogu.com.cn/problem/P3201 题目大意 开始有nnn个布丁,第iii个是cic_ici颜色的. 每次有操作 将所有颜色为xxx的布丁变 ...
- 【启发式合并】梦幻布丁(金牌导航 启发式合并-1/luogu 3201)
梦幻布丁 金牌导航 启发式合并-1 luogu 3201 题目大意 有若干个布丁,给出它们的颜色,每次将一个颜色的所有布丁变成另一种颜色,然后询问有多少段连续的数 输入样例 4 3 1 2 2 1 2 ...
最新文章
- python和c++哪个好找工作-少儿编程学python和C++哪个好
- Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
- Js Chars应用
- 计算机网络word文档,计算机网络word.doc
- sonarqube连mysql_.net持续集成sonarqube篇之sonarqube安装与基本配置
- 联想打印机7256显示更换墨盒_惠普打印机涉嫌垄断?只认自家“昂贵”墨盒,成本太高招架不住...
- spring 3.0.5+velocity tools 2.0
- 不懂函数式?用mobx来写react应用吧
- 天池实验室-Task02-Python入门(中)
- 在Linux下安装LaTeX+CJK+中文字体的方法 [转]
- Phaser开源2d引擎 html5游戏框架中文简介
- SDUT_2012省赛选拔赛2 部分题目
- 软件工程第二次作业——个人项目
- 真正解决办法:FTP 执行命令时500 Illegal PORT command
- TI软件生态及代码讲解——CCS宏定义使用方法
- android WebView加载网页视频
- git命令将项目克隆到本地
- 前端3D立体魔方小游戏
- adb命令查看手机电量_adb获取电池信息以及电量消耗信息
- 2022年施工员-土建方向-岗位技能(施工员)考题模拟考试平台操作