在若干次操作後,某乙個位置的值可以表示成若干各區間的最大值。
例如位置k
kk,我們找到當前操作前最後乙個(編號最大但小於當前編號)覆蓋當前區間左端點的操作的左端點,最後乙個覆蓋當前當前區間右端點的操作的右端點,把這個左右端點當成乙個新的操作區間,然後重複執行上述操作。
也就是我們需要一直向左找,一直向右找,找到最左的和最右的ll,
rrll,rr
ll,rr,k
kk位置上面的即是[ll
,rr]
[ll,rr]
[ll,rr
]這個區間中的最大值。
我們可以把上述操作建成圖,分別建成左樹和右樹,把操作區間當作節點,左樹的父節點即為最後覆蓋當前操作區間左端點的操作區間,右樹同理,我們可以在這顆樹上倍增,就可以快速找到llll
ll和r rrr
rr。具體來說,我們按順序掃瞄操作區間,維護一顆線段樹,區間修改,單點查詢即可。
建出這兩棵樹之後,查詢和修改就不成問題了,用線段樹維護區間最小值,查詢即可,時間複雜度o(n
logn)
o(n\log n)
o(nlogn)
。
咕咕咕
bzoj十連測第二場 A 深邃
一棵樹每個節點有顏色。請將樹分成若干連通塊,使每個連通塊均包含黑點。最小化最大的連通塊的大小。看到雙最直接二分。二分了乙個k,接下來怎麼判定?設f i 表示以i為根的情況 1 f i 為正數,表示以i為根的子樹內除了i所在連通塊均合法,i所在連通塊包含黑點時i所處連通塊大小的最小值。2 f i 為負...
bzoj十連測第三場 A 哈夫曼樹
和的期望 期望的和。因此計算每個節點期望貢獻再加起來即可。乙個結點的期望深度與其數值大小和所在陣列位置無關,因此可以一視同仁。假設還有i顆子樹,我們顯然知道乙個結點肯定處於一顆子樹內。只有在該輪其所在子樹被合併時深度才會加一,所以貢獻為被合併的概率 1。被合併的概率是i 1c2i 2i 所以答案就是...
BFS BZOJ省選十連測 Cycle
蛤?這題絕對有問題。複雜度明顯不對頭。它的想法其實就是找到乙個點,判斷它與它周圍的點能否構成環,然後不能再刪去這個點。然而。他每次都memset了一發,這不t?服都服了。include include include include define sf scanf define pf printf ...