這次竟然分到一道板題……
題目大意
給出乙個長度為n
nn的序列,每個數字一開始都是不超過1000
1000
1000
的正整數。下面進行兩種操作: n
⩽1000000
n\leqslant 1000000
n⩽1000
000,q
⩽3000
q\leqslant 3000
q⩽3000
。思路常見的區間問題中區間長度n
nn和操作次數q
qq範圍都是相當的,而本題q
qq小得有點奇怪,只相當於n
\sqrt n
n。這暗示我們可以用分塊。
由於第二個操作涉及到大小比較,除了給出的a
aa序列外,另外維護乙個序列b
bb,保證b
bb中每一塊內的數字都是有序的。然後就可以愉快的分塊了。
區間修改
對於區間兩端不包含某個塊的部分,暴力對每個值加w
ww。加完後維護一下b
bb序列中對應塊的數字(複製後重新排序)。
對於被區間完全覆蓋的塊,用乙個add
addad
d標記記錄每一塊被整體增加的值。
時間複雜度o(n
log2n
)o(\sqrt n\log_2n)
o(n
log2n
)。區間查詢
對於區間兩端的部分,同樣暴力列舉,記錄大於等於c
cc的數的個數,但注意要加上對應塊的add
addad
d標記。
對於被區間完全覆蓋的塊,在b
bb序列的對應塊內用lower_bound
找出第乙個大於等於c−a
dd
c-add
c−ad
d的位置,然後可以據此計算出該塊內大於等於c
cc的數的個數。
時間複雜度o(n
log2n
)o(\sqrt n\log_2n)
o(n
log2n
)。……然後就完了。注意區分數字的序號和塊的序號,以及最後乙個塊不足n
\sqrt n
n需要特判。
教主的魔法 模擬
可以說是一些塊狀資料結構,用分塊陣列來進行乙個維護,然後對於每個被完整覆蓋的塊用乙個永久化標記來進行儲存一下,一道模板題。分塊陣列模版 include include include include include include include include include include in...
3343 教主的魔法 分塊
教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給xmyz資訊組每個英雄看。於是n個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為1 2 n。每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間 l,r 1 l r n 內的英雄的身高全部加上乙個整數w。雖然l ...
教主的魔法 分塊的用法
題目鏈結點這裡 題目描述 教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給xmyz資訊組每個英雄看。於是n個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為1 2 n。每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間 l,r 1 l r n 內的英雄的身高全...