BZOJ2120 數顏色 帶修改莫隊演算法

2021-08-15 18:03:01 字數 1572 閱讀 3156

數顏色

做法:本題需要用到帶修改莫隊演算法(雖然暴力好像可過……)。

在不帶修改的莫隊演算法裡,我們是將狀態(l

,r) (l,

r)

向狀態(l

±1,r

),(l

,r±1

) (l±

1,r)

,(l,

r±1)

轉移,而帶修改的莫隊演算法就是在狀態中加上一維la

stl as

t,表示上一次修改操作的編號,然後狀態轉移變成將狀態(l

,r,l

ast)

( l,

r,la

st

)向狀態(l

±1,r

,las

t),(

l,r±

1,la

st),

(l,r

,las

t±1)

( l±

1,r,

last

),(l

,r±1

,las

t),(

l,r,

last

±1

)轉移。還有一點不同就是這裡的分塊大小是n2

3 n23

而不是原來的n−

−√n

,這樣能達到o(

n53)

o (n

53

)的時間複雜度。

那麼這題就是帶修改莫隊演算法的裸題了,只需注意在向(l

,r,l

ast±

1)( l,

r,la

st±1

)轉移的過程中,涉及的操作點是否在區間[l

,r] [l,

r]

中,如果是則需要一些特殊處理(相當於刪除乙個元素又新增乙個元素)。

以下是本人**:

#include 

using

namespace

std;

int n,m,blocklen,block[10010],a[10010];

int cnt[1000010],rx[10010],ry[10010],ori[10010],ans[10010],totr=0,totq=0,sum;

int l,r,now;

struct query

q[10010];

bool cmp(query a,query b)

void modify(int x,int add)

}else

}}void mo()

}int main()

else

}sort(q+1,q+totq+1,cmp);

for(int i=totr;i>=1;i--)

a[rx[i]]=ori[i];

mo();

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

printf("%d\n",ans[i]);

return

0;}

bzoj 2120 數顏色 帶修改莫隊

墨墨購買了一套n支彩色畫筆 其中有些顏色可能相同 擺成一排,你需要回答墨墨的提問。墨墨會向你發布如下指令 1 q l r代表詢問你從第l支畫筆到第r支畫筆中共有幾種不同顏色的畫筆。2 r p col 把第p支畫筆替換為顏色col。為了滿足墨墨的要求,你知道你需要幹什麼了嗎?參考 額外維護乙個當前修改...

BZOJ 2120 數顏色(帶修莫隊)

給定乙個序列要求查詢乙個區間不同顏色的個數,支援修改操作。記乙個看起來很sb時間複雜度o n5 3 o n 5 3 連暴力都是o n2 o n 2 但是有些時候可以代替樹套樹而且空間非常小而且超好些的高科技演算法帶修莫隊 時間複雜度就懶得分析了。說幾個細節吧 include using namesp...

bzoj 2120 數顏色 帶修莫隊)

題意 兩種操作 q 詢問區間 l r 內顏色的種類 r 單點修改 思路 帶修莫隊與普通莫隊不同之處就是,帶修莫隊可以支援修改操作,我們可以再維護一維來表示操作的時間,那麼離線處理詢問時,我們就需要維護 l,r,t,三根指標,同時因為是三根指標 塊的大小分成 n的2 3次方,其他地方和普通莫隊維護是一...