[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.pswp.cn/news/249440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249440.shtml
英文地址,請注明出處:http://en.pswp.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