bzoj 2120 數顏色(單點修改莫隊)

2021-10-02 10:04:23 字數 1809 閱讀 2409

普通不帶修改的莫隊是對詢問二元組 (l,

r)(l,r)

(l,r

) 進行分塊排序以降低複雜度

對於單點修改的莫隊,引入乙個時間座標 t,詢問變成三元組:(l,

r,t)

(l,r,t)

(l,r,t

) 每一步 (l,

r,t)

(l,r,t)

(l,r,t

) 有6個方向可走

用類似普通莫隊的分塊方法,對 l,r 以 n23

n^}n3

2​的大小進行分塊,可以證明複雜度為 n53

n^}n3

5​,對 104

10^4

104 的資料還比較快

對於更新修改操作,只需要維護乙個棧,按棧序撤銷即可。

參考部落格

#include

using

namespace std;

const

int maxn =

1e6+10;

int block,n,m,tot,top;

#define pii pair

#define fir first

#define sec second

struct node

bool

operator

<

(const node &rhs)

const

}q[maxn]

;struct ss

}op[maxn]

;char s[maxn]

;int a[maxn]

,curleft,curright,curtime,vis[maxn]

,res,ans[maxn]

;vector sta;

void

modify

(int l,

int r,

int t)

a[x]

= y;

if(curleft <= x && x <= curright)}}

while

(curtime > t)

a[tp.fir]

= tp.sec;

if(curleft <= tp.fir && tp.fir <= curright)

vis[a[tp.fir]]++

;if(vis[a[tp.fir]]==

1) res++;}

curtime--;}

while

(curleft < l)

while

(curleft > l)

while

(curright < r)

while

(curright > r)

}int

main()

block =

min(

500,n)

;sort

(q +

1,q + tot +1)

; res = curleft = curright = curtime =0;

for(

int i =

1; i <= tot; i++

)for

(int i =

1; i <= tot; i++

)printf

("%d\n"

,ans[i]);

return0;

}

bzoj2120 數顏色 分塊

據說暴力可過2200ms。然而我寫分塊也才1200ms。然而很多人寫分塊跑不過暴力。參考了將狼踩盡 的思路。假設分為m塊 注意不是每塊m個 用sum x y z 表示在塊x y中顏色z 經過離散化以後 的個數,val x y 表示在x y塊中不同顏色的個數。這樣應該就比較容易明白了。修改 看u會影響...

BZOJ 2120 數顏色 分塊

time limit 6 sec memory limit 259 mb submit 6031 solved 2392 submit status discuss 墨墨購買了一套n支彩色畫筆 其中有些顏色可能相同 擺成一排,你需要回答墨墨的提問。墨墨會像你發布如下指令 1 q l r代表詢問你從第...

bzoj 2120 數顏色 帶修改莫隊

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