[HNOI2009]梦幻布丁

题目描述

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

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

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

相关文章

用jquery实现html5的placeholder功能

版权声明&#xff1a;本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/QianShouYuZhiBo/article/details/28913501 html5的placeholder功能在表单中经经常使用到。它主要用来提示用户输入信息&#xff0c;当用户点击该输入框之后&#xff0c;提示文字会自己…

mac环境下node.js和phonegap/cordova创建ios和android应用

mac环境下node.js和phonegap/cordova创建ios和android应用 一介布衣 2015-01-12 nodejs 6888 分享到&#xff1a;QQ空间新浪微博腾讯微博人人网微信引用百度百科的一段描述:PhoneGap是一个用基于HTML&#xff0c;CSS和JavaScript的&#xff0c;创建移动跨平台移动应用程序的…

java中多线程 - 多线程中的基本方法

介绍一下线程中基本的方法使用 线程睡眠sleep() Thread.sleep(毫秒);我们可以通过sleep方法设置让线程睡眠。可以看到sleep是个静态方法 public static native void sleep(long var0) throws InterruptedException; try {System.out.println(new Date().getSeconds());Thread.s…

nodejs匿名函数

https://www.cnblogs.com/sharpest/p/8056232.html

Deployment descriptor

Deployment descriptor 是指一种配置文件用于工件部署到一些container/engine。 在Java Platform&#xff0c;Enterprise Edition中&#xff0c;部署描述符描述了应如何部署组件&#xff0c;模块或应用程序&#xff08;如Web应用程序或企业应用程序&#xff09;。它指示部署工具…

cordova 一个将web应用程序封装成app的框架

cordova 一个将web应用程序封装成app的框架 cordova的详细介绍请参考这个链接&#xff1a;http://www.zhoujingen.cn/blog/7034.html 我接下来主要将如何搭建。 1.首先你需要下载几样东西 1.jdk. 2.android_SDK. 2.安装这两个&#xff0c;并配置环境变量 这里jdk的环境变量配置…

windows linux 子系统折腾记

最近买了部新电脑&#xff0c;海尔n4105的一体机&#xff0c;好像叫s7。 放在房间里面&#xff0c;看看资料。因为性能孱弱&#xff0c;所以不敢安装太强大的软件&#xff0c;然后又有一颗折腾的心。所以尝试了win10自带的linux子系统。然后在应用商店搜索linux推荐debian 系统…

nodejs闭包

一、什么是闭包&#xff1f; 官方”的解释是&#xff1a;闭包是一个拥有许多变量和绑定了这些变量的环境的表达式&#xff08;通常是一个函数&#xff09;&#xff0c;因而这些变量也是该表达式的一部分。 相信很少有人能直接看懂这句话&#xff0c;因为他描述的太学术。其实这…

《深入理解Java虚拟机》读书笔记八

第九章 类加载及执行子系统的案例与实战 Q&#xff1a;如果有10个WEB应用程序都是用Spring来进行组织管理的话&#xff0c;可以把Spring放到Common或Shared目录下&#xff08;Tomcat5.0&#xff09;让这些程序共享。Spring要对用户程序的类进行管理&#xff0c;自然要能访问到用…

一些非常有用的链接和工具

微信公众平台SDK Senparc.Weixin for C#&#xff0c;支持.NET Framework及.NET Core &#xff1a; https://github.com/JeffreySu/WeiXinMPSDK layui开发文档地址&#xff1a;https://www.layui.com/doc/ .Net Core GitHub社区 &#xff1a; https://github.com/dotnetcore EF…

Activity Intent相关FLAG介绍

先首先简单介绍下Task和Activity的关系 Task就像一个容器&#xff0c;而Activity就相当与填充这个容器的东西&#xff0c;第一个东西&#xff08;Activity&#xff09;则会处于最下面&#xff0c;最后添加的东西&#xff08;Activity&#xff09;则会在最上面。从Task中取出东西…

js的原型和原型链

构造函数创建对象&#xff1a; function Person() {} var person new Person(); person.name Kevin; console.log(person.name) // KevinPerson 就是一个构造函数&#xff0c;我们使用 new 创建了一个实例对象 person prototype 每个函数都有一个 prototype 属性 每一个Ja…

二维数组

要求&#xff1a;求一个二维数组的最大子数组和 思路&#xff1a;对于这个题&#xff0c;我会最简单的读取&#xff0c;虽然在网上查到了代码&#xff0c;但是查找最大子数组的循环我真的看不懂&#xff0c;也不是特别懂思路&#xff0c;所以在这不会写思路 package 二维数组; …

资源

资源链接&#xff1a; 内存池TinySTLminiSTLcghSTL1. lishuhuakai 2. 转载于:https://www.cnblogs.com/sunbines/p/9707483.html

Android判断应用或Activity是否存在

一、根据包名判断应用是否存在public boolean checkApplication(String packageName) { if (packageName null || "".equals(packageName)){ return false; } try { ApplicationInfo info getPackageManager().getApplicationInfo(packageName, PackageManager.GET…

vue ref

https://www.jianshu.com/p/623c8b009a85

033 Url中特殊字符的处理

在url跳转页面的时候&#xff0c;参数值中的#不见了&#xff0c;一直没有处理&#xff0c;今天有空看了一下&#xff0c;后来发现后台的过滤器之类的都没有处理&#xff0c;就比较奇怪了&#xff0c;原来是特殊字符的问题。 一&#xff1a;Url中的特殊字符 1.说明 这里还是需要…

Effective Java(1)-创建和销毁对象

Effective Java&#xff08;1&#xff09;-创建和销毁对象 转载于:https://www.cnblogs.com/Johar/p/10556218.html

什么是Affinity

什么是Affinity 在某些情况下&#xff0c;Android需要知道一个Activity属于哪个Task&#xff0c;即使它没有被启动到一个具体的Task里。这是通过任务共用性&#xff08;Affinities&#xff09;完成的。任务共用性&#xff08;Affinities&#xff09;为这个运行一个或多…

vue this

https://blog.csdn.net/cddcj/article/details/80866902