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] 梦幻布丁 启发式合并相关推荐

  1. P3201 [HNOI2009]梦幻布丁 [启发式合并][set]

    P3201 [HNOI2009]梦幻布丁 题意:N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3 ...

  2. ac 梦幻布丁 启发式合并

    题意:中文题. 对于每种颜色,我们都可以看成一个集合.让后把一种颜色变成另一种颜色就转换成了把两个集合的合并问题.显然我们有一个复杂度为O(NlogN)O(NlogN)O(NlogN)的启发式合并能完 ...

  3. 链表+启发式合并(bzoj 1483: [HNOI2009]梦幻布丁)

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 3323  Solved: 1304 [Submit][Sta ...

  4. 【bzoj1486】【[HNOI2009]梦幻布丁】启发式链表合并(详解)

    (画师当然是武内崇啦) Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3 ...

  5. 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁

    Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第 ...

  6. [HNOI2009]梦幻布丁

    题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 第一行给出N,M表示布丁的个 ...

  7. 【金牌导航】【洛谷 P3201】【启发式合并】梦幻布丁

    [金牌导航][洛谷 P3201][启发式合并]梦幻布丁 题目 解题思路 启发式合并真的就是想到挺难的,想到后简单得很 如何判断有几段还是很容易的,如果和前一个布丁颜色不同,段数+1 将每一种颜色看作一 ...

  8. P3201-[HNOI2009]梦幻布丁【启发式合并,链表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3201 题目大意 开始有nnn个布丁,第iii个是cic_ici​颜色的. 每次有操作 将所有颜色为xxx的布丁变 ...

  9. 【启发式合并】梦幻布丁(金牌导航 启发式合并-1/luogu 3201)

    梦幻布丁 金牌导航 启发式合并-1 luogu 3201 题目大意 有若干个布丁,给出它们的颜色,每次将一个颜色的所有布丁变成另一种颜色,然后询问有多少段连续的数 输入样例 4 3 1 2 2 1 2 ...

最新文章

  1. python和c++哪个好找工作-少儿编程学python和C++哪个好
  2. Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
  3. Js Chars应用
  4. 计算机网络word文档,计算机网络word.doc
  5. sonarqube连mysql_.net持续集成sonarqube篇之sonarqube安装与基本配置
  6. 联想打印机7256显示更换墨盒_惠普打印机涉嫌垄断?只认自家“昂贵”墨盒,成本太高招架不住...
  7. spring 3.0.5+velocity tools 2.0
  8. 不懂函数式?用mobx来写react应用吧
  9. 天池实验室-Task02-Python入门(中)
  10. 在Linux下安装LaTeX+CJK+中文字体的方法 [转]
  11. Phaser开源2d引擎 html5游戏框架中文简介
  12. SDUT_2012省赛选拔赛2 部分题目
  13. 软件工程第二次作业——个人项目
  14. 真正解决办法:FTP 执行命令时500 Illegal PORT command
  15. TI软件生态及代码讲解——CCS宏定义使用方法
  16. android WebView加载网页视频
  17. git命令将项目克隆到本地
  18. 前端3D立体魔方小游戏
  19. adb命令查看手机电量_adb获取电池信息以及电量消耗信息
  20. 2022年施工员-土建方向-岗位技能(施工员)考题模拟考试平台操作

热门文章

  1. 怎么修改mysql服务器密码忘记_服务器忘记mysql密码怎么修改
  2. Linux必会100个命令(五十三)dmesg命令
  3. 算法整理:外排序篇-置换选择排序最佳归并树
  4. oracle dbms_workload_repository,AWR dbms_workload_repository使用
  5. 笔记本安装tensorflow全攻略
  6. 华为正式推出快游戏,Cocos 率先支持
  7. 负数 补码 原码
  8. clickonce 使用总结
  9. 添加盐值生成加密密码
  10. JS方法之slice()