傳送門
然後這題是另乙個特殊情況版本
其實有乙個比較顯然的貪心
我們按照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...