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

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

4 3
1 2 2 1
2
1 2 1
2

Sample Output

3
1

题解

用链表来更好的遍历每种颜色 暴力遍历算对答案的贡献
合并时用启发式合并 就是如果s[b]<s[a] 就把b和入a 但是把a和b真实对应的颜色改一下(很常用的技巧)
那么对于最不好的情况 也就是每次s[b]=s[a]
合并时 s扩大logn次 如果把同一个s级别的一起看 每次O(n) 所以最坏时间复杂度O(nlogn)
虽然这道题不用启发式合并速度也差不多(但就要注意b为空的情况了 启发式合并可以直接避免)
再次记一下合并链表步骤(合a入b)
next[b尾]=a首;b首=a首;清空a;

代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+5,M=1e6+5;int c[N],next[N],head[M],last[M],p[M],s[M];
int n,m,ans;int solve(int a,int b){s[b]+=s[a];s[a]=0;for(int i=last[a];i;i=next[i]){if(c[i-1]==b) ans--;if(c[i+1]==b) ans--;}for(int i=last[a];i;i=next[i]) c[i]=b;next[head[b]]=last[a];head[b]=head[a];last[a]=head[a]=0;
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&c[i]);p[c[i]]=c[i];s[c[i]]++;if(c[i]!=c[i-1]) ans++;if(!last[c[i]]) head[c[i]]=i;next[i]=last[c[i]];last[c[i]]=i;}int x,a,b;for(int i=1;i<=m;i++){scanf("%d",&x);if(x==1){scanf("%d%d",&a,&b);if(a==b) continue;if(s[p[a]]>s[p[b]]) swap(p[a],p[b]);a=p[a];b=p[b];if(!s[a]) continue;solve(a,b);}else printf("%d\n",ans);}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/xkui/p/4535512.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vbs当计算机重启,用vbs实现重新启动 Internet Explorer

用vbs实现重新启动 Internet Explorer2007-03-25 00:00:00 作者&#xff1a;用vbs实现重新启动 Internet Explorer问&#xff1a;您好&#xff0c;脚本专家&#xff01;如果未运行其他实例&#xff0c;如何重新启动 Internet Explorer&#xff1f;-- MT答&#xff1a;您好&…

bem什么意思_BEM命名法

摘要当你在编写css代码的时候&#xff0c;是否遇到这样的困扰: 不知道取什么class名? 修改某个组件的样式&#xff0c;担心影响了其他组件? 编写的组件样式如何复用&#xff1f;为了解决这些问题&#xff0c;聪明的程序猿发明了BEM命名法。 BEM命名法&#xff0c;是对css命名…

HDU1232——通畅工程(并查集)

http://acm.hdu.edu.cn/showproblem.php?pid1232 这道题是学习并查集的第一道题。 并查集&#xff0c;他的思路是构成一个树结构&#xff0c;如果这两个节点的根节点相同&#xff0c;那么说明这两个节点在一个集合里&#xff0c;否则不再一个集合。 查找根节点&#xff1a;当然…

小程序秒杀活动服务器,微信小程序官方上线张大仙周年活动,人数太多把服务器弄崩溃了...

原标题&#xff1a;微信小程序官方上线张大仙周年活动&#xff0c;人数太多把服务器弄崩溃了说起如今人气最旺的《王者荣耀》主播&#xff0c;莫过于就是靠着一手“素质直播”走遍天下的张大仙了。之前由于一些合同上面的问题&#xff0c;张大仙被迫停播了一段时间&#xff0c;…

curl 怎么在xp下使用_Http Post 快速使用

点击上方蓝字可直接关注&#xff01;方便下次阅读。如果对你有帮助&#xff0c;麻烦点个在看或点个赞&#xff0c;感谢~一直对http很陌生&#xff0c;这次借助libcurl分享一个快速使用http post的案例。平台&#xff1a;ubuntu16.04一、libcurl的安装1. Git上下载 master最新代…

2015-05-31

ARC4random 生成任意整数 要生成某一范围的数可以用取模运算 ID对象不能用点语法 Arc4random()%12 等价于arc4random_uniform(12) 文本框有个inputview 用来设置自定义键盘 toolbar 中的identifier 用来设置样式&#xff0c;其中flexible space为可伸缩的空条&#xff08;使右…

ajax 高并发请求,理解node.js处理高并发请求原理

很少分享技术文章&#xff0c;写的不好的地方请大家多多指教&#xff0c;本文是自己对于node.js的一些见解&#xff0c;如有纰漏请在评论区交流。高并发策略通常高并发的解决方案就是提供多线程模型&#xff0c;服务器为每个客户端请求分配一个线程&#xff0c;使用同步 I/O&am…

abaqus生成adams柔性体_基于ADAMS 的大型反铲挖泥机加装破碎锤 结构动力学分析

刘 斌 徐沪萍 王 磊武汉理工大学物流工程学院 武汉 430063摘 要&#xff1a;以配备液压破碎锤的反铲挖泥船反铲挖泥机为研究对象&#xff0c;简单介绍加装液压破碎锤方案&#xff0c;然后运用动力学理论和相关的动态仿真软件&#xff0c;通过建立反铲挖泥机的刚柔耦合模型&…

Vector 特性

1.Vector是一个连续内存占用的容器 2.每次Insert&#xff0c;都会将插入的对象先析构&#xff0c;然后复制一个副本添加到容器内 3.容器的大小先是1&#xff0c;然后是2&#xff0c;然后是4&#xff0c;也可以使用reserve来重新制定队列的长度 4.当erase删除一个或者clear之后&…

路由器桥接显示服务器已满,两个迅捷路由器经过有线桥接已经成功连接上,但是测试的时候副路由器却连接不上服务器?为什么?谢谢!...

主路由器工作模式为AP&#xff0c;第二级路由器设置WDS。简单点就是&#xff1a;主路由器就是普通上网设置&#xff0c;帐号密码&#xff0c;指定信道&#xff0c;无线密钥&#xff0c;DHCP启用等等&#xff0c;副路由器&#xff0c;只是设置信道&#xff0c;WDS打勾&#xff0…

rust加载不进去服务器eac_基于腾讯云的 Rust 和 WebAssembly 函数即服务

腾讯云云函数 (SCF) 已经支持十多种编程语言和运行时框架。腾讯云最近发布的 SCF custom runtime&#xff08;自定义运行时&#xff09;更进一步 —— SCF 现在可以支持用任何编程语言编写的函数。本文将介绍如何在云函数 SCF 中运行用 Rust 编写的 WebAssembly 函数。我们先介…

SChema中group指示器的使用

<?xml version"1.0" encoding"UTF-8"?> <!-- edited with XMLSpy v2011 (http://www.altova.com) by qmy (sigmartix) --> <xs:schema xmlns:xs"http://www.w3.org/2001/XMLSchema" elementFormDefault"qualified" a…

java ee项目部署到服务器上405,HTTP状态405 - HTTP POST方法不受此URL支持:采用的GlassFish服务器的NetBeans...

I am getting this error on using post method in my form-- HTTP Status 405 - HTTP method POST is not supported by this URL.我register.html文件如下&#xff1a;Register formName:Email ID:Password:我Register.java servlet代码是如下package Glassfish;import java.…

ceb怎么转换成word_PDF怎么转换成Word?分享免费转换技巧!

PDF怎么转换成Word&#xff1f;pdf格式无法编辑众所周知的事&#xff0c;但如果我们需要将其进行编辑使用的话&#xff0c;就需要将pdf格式转换成word格式。可是怎么将pdf转换成word一直是件令人头疼的事&#xff01;所以今天小编给大家分享几个pdf转word免费转换技巧&#xff…

[FZYZOJ 1038] 隧道

P1038 -- 隧道 时间限制&#xff1a;1000MS 内存限制&#xff1a;65536KB Description 一座小镇正在着手建造自己的地铁线路网。小镇坐落在许多小岛上&#xff0c;小岛之间通过隧道或者桥梁连接。地铁就在这些已有的桥梁和隧道的基础上建成。由于地铁主要是在地下&#xf…

音创ktv点歌系统服务器,音创ktv点歌系统家庭版

光行资源网为用户提供的音创ktv点歌系统电脑版是为ktv和家庭影院专门设计打造的点歌软件&#xff0c;相信很多朋友们都去过ktv点歌&#xff0c;大家点歌时的界面就是专门的点歌系统。特色1、方便性&#xff1a;安装调试简单方便&#xff0c;减少了您购买后所带来的多种维护烦恼…

7极限精简版64位_DNF:国服更新64位客户端深度体验,真的有如此丝滑吗?

DNF最新最快资讯&#xff0c;最全最细攻略&#xff0c;尽在骑乌龟的蜗牛12年&#xff0c;地下城的游戏客户端终于获得了升级&#xff0c;从32位更新到了64位&#xff0c;关于更新带来的游戏好处大家应该都在很多地方看过&#xff0c;而国服正式服也终于在8.20版本的更新中将客户…

MYSQL BENCHMARK函数的使用

MYSQL BENCHMARK函数是最重要的函数之一&#xff0c;下文对该函数的使用进行了详尽的分析&#xff0c;如果您对此感兴趣的话&#xff0c;不妨一看。 下文为您介绍的是MYSQL BENCHMARK函数的语法&#xff0c;及一些MYSQL BENCHMARK函数相关问题的测试&#xff0c;供您参考学习。…