鏈結
$reki$ 在課餘會接受一些民間的鷹眼類委託,即遠距離的狙擊監視防衛.。$reki$ 一共接收到$m$份委託,這些委託與 $n$ 個直線排布的監視點相關。第 $i$ 份委託的內容為:對於區間 $[r_i, \ j_i]$ 中的監視點,至少要防衛其中的 $k_i$ 個點。$reki$ 必須完成全部委託,並希望選取盡量少的監視點來防衛。($n \leq 500000, \ m \leq 1000000$)。
一眼看,發現是道差分約束的裸題。設點i的值為sum[i],如果l-r中至少有x個,就是sum[r]-sum[l-1]>=x。
我們把區間根據右端點大小排序。對於每乙個區間,若這個區間滿足條件就continue,如果不滿足就盡量填在右邊。
我們採用樹狀陣列來維護,對相應的點進行加1操作、對區間求和操作。最多修改 $n$ 個點,時間複雜度為$o(n \log n)$.
#includeusingnamespace
std;
const
int maxn = 500000 + 10
;const
int maxm = 1000000 + 10
;int
a[maxn], n, m;
bool
vis[maxn];
struct
node
}q[maxm];
struct
bit
int lowbit(int
x)
int sum(int
x)
return
ret;
}void add(int x, int
d)
}}bit;
intmain()}}
printf(
"%d\n
", bit.sum(n));
return0;
}
1. 2.
牛客練習賽3 F 監視任務 貪心 線段樹
傳送門 然後這題是另乙個特殊情況版本 其實有乙個比較顯然的貪心 我們按照r rr從小到大排序 第乙個區間的右端點最小,那麼這k kk個哨兵肯定是貼這右端點往左放 考慮第二個區間,同樣是往右端點往左防止,這樣對右邊的區間最容易產生貢獻 這個過程用線段樹來維護 攜帶乙個引數k kk表示需要在 l,r l...
牛客練習賽58 F
求帶單點修改的樹上兩點間任意子路徑長異或和。路徑長等於路徑上所有異或和。簡單模擬一下,可以發現。奇數情況下,答案是偶數點異或和。偶數情況下,就是正常的異或和。偶數點異或和也很容易處理。分深度奇偶樹狀陣列即可。但是這是對於鏈的,不能直接dfs dfsdf s序,需要剖分一下。但是我不會,所以去學了一下...
牛客練習賽25 F 青蛙 貪心,尺取
傳送門 我是個fwfw fw由於第1 11塊石頭有無限的青蛙 所以首先把所有a i a 1 d a i a 1 d a i a 1 d 的石頭都佔乙個青蛙不會使答案邊劣 那麼現在 1,r 1,r 1,r 都有乙隻青蛙 這些青蛙,肯定是最左邊的青蛙最容易被拋棄 那麼嘗試把最左邊的青蛙跳到r 1 r 1...