思路
顯然,這題正著不太好推,那麼就考慮二分答案,有乙個很大的問題,我們需要在\(o(n\log n)\)或者\(o(n)\)的時間內判斷我們二分答案的可行性。首先肯定想到貪心,但是你會發現每乙個元素需要加的值不一樣,加了值以後影響的範圍也不一樣,並不好維護。
因為涉及到區間修改,考慮使用線段樹。我們維護每一位置已經加了多少。
首先明確什麼情況下是必須操作一次的(當前值小於二分所得的最小值的前提下):
而對於每一次操作,我們可以用線段樹方便地進行區間加。至於每乙個點已經加的值,單點查詢就可以了。
**
#include #include #include using namespace std;
const int maxn = 1e5 + 10;
int n,m,w,a[maxn];
struct seg_tree
void f(int l, int r, int p, int x)
void downdate(int l, int r, int p)
}void add(int l, int r, int l, int r, int p, int x)
downdate(l, r, p);
int mid = (l + r) >> 1;
if(mid >= l) add(l, r, l, mid, lc(p), x);
if(mid < r) add(l, r, mid + 1, r, rc(p), x);
c[p] = c[lc(p)] + c[rc(p)];
}int query(int l, int r, int p, int pos)
}tree;
inline int check(int mid)
} if(cnt > m)
}if(cnt > m || !flag) return 0;
else return 1;
}int main()
while(h >= l) printf("%d\n", l - 1);
return 0;
}
C Present(二分 掃瞄線)
題意 盆花,澆 次水,每次可使花高度 每次可澆相鄰的 盆,ai 表示 i th盆花 的高度 問 當澆完 次後,最矮的一盆花最高可以使多少?解題思路 二分 掃瞄線,由於高度最高 0 10e5 最小1,然後在 這範圍內二分搜尋。假設此時二分高度為 h 6,每朵花初始高度依次如圖所標。首先給第一朵花澆水,...
CF1042A Benches(二分答案)
掛個鏈結codeforces 題目大意 給你 n 個長椅,每張長椅上面有 a i 個人,現在有m個人來了,求讓著m個人坐上去後長椅上的人的最大數和最小數 分析 本題的要求為最大化最大值和最小化最大值,所以看到第二個我們考慮二分答案。include include include include in...
CF732D Exams 二分 貪心
思路 二分 貪心 提交次數 10次以上 錯因 剛開始以為二分 邊界,1or 1 寫錯了,調了半天,後來才發現是 ck 寫錯了。開始只判了最後是否小於零,而應該中間一旦小於零就 return space false 題解 二分天數 單調性顯然 ck int x 首先 x 天內必須包含所有科目 然後貪心...