题目描述

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

第一行给出N,M表示布丁的个数和好友的操作次数. 第二行N个数A1,A2...An表示第i个布丁的颜色从第三行起有M行,对于每个操作,若第一个数字是1表示要对颜色进行改变,其后的两个整数X,Y表示将所有颜色为X的变为Y,X可能等于Y. 若第一个数字为2表示要进行询问当前有多少段颜色,这时你应该输出一个整数.

Solution

膜了一发hzwer。

我们对于每一种颜色,开邻接表,把它搞成一个队列的形式,开一个数组记录它的开头。

对于一个修改,我们采用启发式合并的方式,可以把均摊复杂度将至llogn。

合并两个队列的方式就是把第一个队列接到第二个队列后面就可以了。

e[st[x]]=head[y];head[y]=head[x];就是这样

为了避免启发式合并之后颜色出现错乱if(!st[a[i]])st[a[i]]=i;if(size[ji[x]]>size[ji[y]])swap(ji[x],ji[y]);x=ji[x];y=ji[y];

Code

#include<iostream>
#include<cstdio>
#define NN 1000002
#define N 100002
using namespace std;
int head[NN],ans,size[NN],e[N<<1],a[N],n,m,x,y,st[NN],ji[NN];
inline void solve(int x,int y){for(int i=head[x];i;i=e[i]){if(a[i+1]==y)ans--;if(a[i-1]==y)ans--; }for(int i=head[x];i;i=e[i])a[i]=y;size[y]+=size[x];e[st[x]]=head[y];head[y]=head[x];size[x]=0;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&a[i]);ji[a[i]]=a[i];if(!st[a[i]])st[a[i]]=i;if(a[i]!=a[i-1])ans++;e[i]=head[a[i]];head[a[i]]=i;size[a[i]]++;}for(int i=1;i<=m;++i){scanf("%d",&x);if(x==2)printf("%d\n",ans);else{scanf("%d%d",&x,&y);if(x==y)continue;if(size[ji[x]]>size[ji[y]])swap(ji[x],ji[y]);x=ji[x];y=ji[y];if(size[x]==0)continue;solve(x,y);}}return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/9696538.html

[HNOI2009]梦幻布丁相关推荐

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

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

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

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

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

    P3201 [HNOI2009] 梦幻布丁 考察:启发式合并,set 思路: 这种不可逆的改变都应该采用启发式合并,即把集合大小小的合并到大的去.那么要统计cnt,遍历小的集合中的每个元素,它前面的那 ...

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

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

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

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

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

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

  7. 【BZOJ1483】【codevs2335】【hdu5997】梦幻布丁+加强版,LCA+主席树

    传送门1 传送门2 传送门3 思路: 这还要从上一周的BC说起-- 因为正好放大周,在家里颓了一天后准备BC#90 干完两个签到题以后开始搞T3 抽象了很久YY出来一个并查集+主席树 连蒙带骗写了一发 ...

  8. HYSBZ 1483 梦幻布丁

    HYSBZ 1483 梦幻布丁 模拟链表,链表启发式合并 题意 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的 ...

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

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

最新文章

  1. 【Java 注解】注解简介及作用
  2. QT的第一个程序HELLO WORLD
  3. 弱电工程光纤传输基础知识
  4. php预处理查询数据库,php+mysqli使用预处理技术进行数据库查询的方法
  5. 手动构建磁贴服务器(16.04.2 LTS)
  6. 单片机 c语言 概念题,(C语言版)单片机复习题.doc
  7. Struts2中的值栈
  8. c语言异或运算符_计算机中C语言的-运算符
  9. 设计师面试提前准备好这10个面试问题,助你面试成功
  10. OpenStack、CloudStack、Eucalyptus和vCloud Director四大主流云平台怎么选?
  11. win10如何安装IIS
  12. opmanager监控linux,OpManager管理员指南.doc
  13. jQ模拟下拉框以及向下三角
  14. linux下dns解析出错该如何配置
  15. 大学计算机考试不挂科秘诀,在大学,考试想不挂科,学渣的4个锦囊妙计,最后一点看笑了!...
  16. 加入共享宽带,让你的闲置宽带循环利用再变现
  17. 计算机专业英语形成型考核册,电大资源网《人文英语3》形成性考核册作业题目和答案2018年...
  18. 【威胁通告】攻击者利用漏洞攻击Edimax WiFi桥接器
  19. 京东回应淘汰员工,这是要过冬节奏?
  20. Project ERROR: Cannot run target compiler ‘aarch64-linux-gnu-g++‘.

热门文章

  1. java中多态的例子_java中的多态案例
  2. linux的技术点,给你的Linux系统上点stress
  3. 【算法竞赛学习】数据分析达人赛2:产品关联分析
  4. iPad连android热点掉线,苹果终于承认,iOS 13有这个问题,网络断连的原因找到了...
  5. 64位ubuntu 12.04编译linux内核提示mkimage command not found
  6. [递归]递归问题解题思路
  7. [机器学习]PMML预测模型标记语言
  8. 想做硬件开发的人员必看
  9. 美国人口普查年收入比赛_训练网络对收入进行分类:成人普查收入数据集
  10. 遭遇棘手 交接_Librosa的城市声音分类-棘手的交叉验证