開始也想到二分,但是無法判斷哪些天數比它大,比它小
排序啊,人按浪費的時間排序,題按時間排序,下標加入線段樹
#include#define n 200005
#define ll long long
using namespace std;
int m,n,ans[n],mid,cnt[n*4];//時間總和 個數總和
ll tot[n*4];
struct node1t[n];
struct node2v[n];
bool cmp1(node1 x,node1 y)
bool cmp2(node2 x,node2 y)
int read()
void add(int root,int l,int r,int position,int w)
void quary(int root,int l,int r,int w,int cur)
int mid=(l+r)>>1;
if(tot[root<<1]-(ll)cnt[root<<1]*w>=cur)//根據cur的值來找到第幾天
quary(root<<1,l,mid,w,cur);
else quary(root<<1|1,mid+1,r,w,cur-(tot[root<<1]-(ll)cnt[root<<1]*w));}
int main()
if(tot[1]-(ll)(v[i].d*cnt[1])當前的人
else
}for(int i=1;i<=n;i++) cout<
return 0;
}
hdu 6070 二分答案 線段樹
題意 區間價值為 區間元素種類數 區間長度 問最小價值的區間是?思路 直接求解很困難,考慮二分答案判斷,注意這題的關鍵是將二分答案後的不等式進行變換,如官方題解。二分答案 mid,檢驗是否存在乙個區間滿足 size l,r r l 1 mid,也就是 size l,r mid l mid r 1 之...
CF460CPresent(二分答案 線段樹)題解
思路 顯然,這題正著不太好推,那麼就考慮二分答案,有乙個很大的問題,我們需要在 o n log n 或者 o n 的時間內判斷我們二分答案的可行性。首先肯定想到貪心,但是你會發現每乙個元素需要加的值不一樣,加了值以後影響的範圍也不一樣,並不好維護。因為涉及到區間修改,考慮使用線段樹。我們維護每一位置...
Sequence(線段樹 二分)
傳送門 第二次做這種題目,把人做傻了,沒想到是二分,只是隱隱約約感覺到了二分的影子。於是寫了兩個查詢的函式,但是發現查詢的函式無法解決求左邊最大值和右邊最小值的問題。寫了一大堆爛 正解只需要在查詢的時候不斷二分就行了。include using namespace std typedef long ...