普通不帶修改的莫隊是對詢問二元組 (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。為了滿足墨墨的要求,你知道你需要幹什麼了嗎?參考 額外維護乙個當前修改...