演算法複習 帶修改莫隊 bzoj2453

2022-05-23 13:24:16 字數 1590 閱讀 9423

你小時候玩過彈珠嗎?

小朋友a有一些彈珠,a喜歡把它們排成佇列,從左到右編號為1到n。為了整個佇列鮮豔美觀,小朋友想知道某一段連續彈珠中,不同顏色的彈珠有多少。當然,a有時候會依據個人喜好,替換佇列中某個彈珠的顏色。但是a還沒有學過程式設計,且覺得頭腦風暴太浪費腦力了,所以向你來尋求幫助。

輸入檔案第一行包含兩個整數n和m。

第二行n個整數,表示初始佇列中彈珠的顏色。

接下來m行,每行的形式為「q l r」或「r x c」,「q l r」表示a想知道從佇列第l個彈珠到第r個彈珠中,一共有多少不同顏色的彈珠,「r x c」表示a把x位置上的彈珠換成了c顏色。

對於每個q操作,輸出一行表示詢問結果。

2 31 2

q 1 2

r 1 2

q 1 221

對於100%的資料,有1 ≤ n ≤ 10000, 1 ≤ m ≤ 10000,小朋友a不會修改超過1000次,所有顏色均用1到10^6的整數表示。

2011福建集訓

帶修改莫隊就是莫隊原有排序基礎上加個第三關鍵字:時間,注意排序的順序都是以所在塊為順序另外利用判斷是否在指標內的陣列visit[i]結合乙個巧妙的change和update操作,另外注意分塊的大小為n的2/3次方.

具體見

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=1e4+5

;const

int m=1e6+5

;inline

intr()

struct

node

ask[n];

struct

node2

modi[n];

ints,n,m,cnt[m],last[n],tots,tota,totm,num[n],id[n],head,tail,now,ans,anss[n];

bool

visit[n];

inline

bool

cmp(node a,node b)

inline

void update(int

pos)

else

visit[pos]^=1;}

inline

void change(int pos,int

val)

else

num[pos]=val;

}int

main()

sort(ask+1,ask+tota+1,cmp);head=1;

for(int i=1;i<=tota;i++)

for(int i=1;i<=tota;i++)

printf(

"%d\n

",anss[i]);

return0;

}

bzoj2120 2453 帶修改莫隊

待修改莫隊裸題。當莫隊有修改操作時,只要記錄每個詢問的時間,在兩次詢問之間修改就可以了。可以證明時間複雜度是o n 5 3 的 具體看 1 include2 include3 include4 include5 include6 using namespace std 7 define n 1001...

BZOJ 2120 帶修改莫隊

簡略題意 單點修改,區間查詢不同顏色個數。帶修改莫隊的板題,學習了乙個。和普通莫隊的區別在於塊的大小需要設定為n2 3,這樣可以確保複雜度為o n3 5 每次詢問之前需要把在當前時間點之前的所有修改用上,這之後的所有修改刪掉。define others ifdef poj include inclu...

bzoj2120 2453 帶修改莫隊

待修改莫隊裸題。當莫隊有修改操作時,只要記錄每個詢問的時間,在兩次詢問之間修改就可以了。可以證明時間複雜度是o n 5 3 的 具體看 1 include2 include3 include4 include5 include6 using namespace std 7 define n 1001...