牛客練習賽3 F 監視任務 貪心 線段樹

2021-10-12 09:35:07 字數 1189 閱讀 8995

傳送門

然後這題是另乙個特殊情況版本

其實有乙個比較顯然的貪心

我們按照r

rr從小到大排序

第乙個區間的右端點最小,那麼這k

kk個哨兵肯定是貼這右端點往左放

考慮第二個區間,同樣是往右端點往左防止,這樣對右邊的區間最容易產生貢獻

這個過程用線段樹來維護

攜帶乙個引數k

kk表示需要在[l,

r]

[l,r]

[l,r]從r

rr往左找k

kk個空位放哨兵

然後優先填充右兒子,再去左兒子即可

看**吧

#include

using

namespace std;

#define mid (l+r>>1)

#define ls (rt<<1)

#define rs (rt<<1|1)

#define lson ls,l,mid

#define rson rs,mid+1,r

const

int maxn =

2e6+10;

int a[maxn]

,laz[maxn]

,n,m;

struct p

}s[maxn]

;void

push_down

(int rt,

int l,

int r)

intupdate

(int rt,

int l,

int r,

int l,

int r,

int val)

push_down

(rt,l,r)

; val =

update

(rson,l,r,val)

; val =

update

(lson,l,r,val)

; a[rt]

= a[ls]

+a[rs]

;return val;

}int

ask(

int rt,

int l,

int r,

int l,

int r)

intmain()

牛客練習賽3 F 監視任務 貪心 樹狀陣列

鏈結 reki 在課餘會接受一些民間的鷹眼類委託,即遠距離的狙擊監視防衛.reki 一共接收到 m 份委託,這些委託與 n 個直線排布的監視點相關。第 i 份委託的內容為 對於區間 r i,j i 中的監視點,至少要防衛其中的 k i 個點。reki 必須完成全部委託,並希望選取盡量少的監視點來防衛...

牛客練習賽58 F

求帶單點修改的樹上兩點間任意子路徑長異或和。路徑長等於路徑上所有異或和。簡單模擬一下,可以發現。奇數情況下,答案是偶數點異或和。偶數情況下,就是正常的異或和。偶數點異或和也很容易處理。分深度奇偶樹狀陣列即可。但是這是對於鏈的,不能直接dfs dfsdf s序,需要剖分一下。但是我不會,所以去學了一下...

Wannafly模擬賽3 監視任務(貪心 線段樹)

思路 把所有約束按照右端點排序。這樣每乙個前面的約束區間 l1,r1 與後面的乙個約束區間 l2,r2 的交,一定為 max l1 l2 r1 對於排序後的區間依次滿足約束,假設當前列舉到的約束還沒有滿足,就不斷把對應區間中最右端的0改為1,這些過程可以用線段樹維護來完成。時間複雜度o n m lo...