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

2022-05-02 01:06:08 字數 971 閱讀 5177

鏈結

$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)$.

#includeusing

namespace

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...