BZOJ2453 維護佇列 題解

2022-05-16 16:07:41 字數 2199 閱讀 7991

你小時候玩過彈珠嗎?

小朋友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的整數表示。

一種單點修改的分塊。

我們維護:

1.sum[i][j]:前j塊i元素出現次數。

2.ans[i][j]:i~j塊的顏色種數。

修改的時候我們顯然sum陣列可以o(sqrtn)修改成功,而ans陣列通過暴力也可以在o(n/4)的複雜度中修改成功。

(實現方法看**吧……)

剩下的查詢就比較簡單了(可能是分塊分多的錯覺)

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=10010

;const

int sqrtn=110

;const

int m=11010

;const

int inf=2147483647

;inline

intread()

while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}struct

questionq[n];

intn,m,lim,s,cnt,a[n],b[m],bl[sqrtn],br[sqrtn];

intsum[m][sqrtn],ans[sqrtn][sqrtn];

bool

vis[m];

inline

void

initlsh()

return;}

inline

int lsh(int x)

inline

void

intoblock()

}br[cnt]=n;bl[cnt+1]=n+1

;

return;}

inline

void

init()

}for(int i=1;i<=cnt;i++)}}

}return;}

inline

void modify(int x,int

c) }

for(int i=now;i<=cnt;i++)sum[old][i]--,sum[nw][i]++;

return;}

inline

int query(int l,int

r) }

return

cur;

}int l=(l-1)/s+1,r=(r-1)/s+1

; cur+=ans[l+1][r-1

];

for(int i=l;i<=br[l];i++)vis[a[i]]=0

;

for(int i=bl[r];i<=r;i++)vis[a[i]]=0

;

for(int i=l;i<=br[l];i++)

}for(int i=bl[r];i<=r;i++)

}return

cur;

}int

main()

initlsh();

intoblock();

init();

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

return0;

}

bzoj 2453 維護佇列

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

BZOJ 2453 維護佇列

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

bzoj2453 維護佇列

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