為何要用整體二分,整體二分應該怎樣二分,和[poi2011]met-meteors十分相像,這裡就不再重複。
那麼對於乙個顧客來講,如果當前的區間總份數小於他想要的份數,或者是區間最小**大於他能接受的最大**,就把該顧客劃分到右區間,如若滿足則劃分到左區間。
想要和[poi2011]met-meteors一樣對於每個solve只做l-mid的修改操作,發現不可行;但若不這樣修改,又會超時。
所以我們改變乙個列舉的方式:記錄乙個變數t,表示當前已經修改過的區間為[1,t]。這樣就可以使得前半個區間不進行 多次修改再復原,修改再復原 這樣的無意義操作了。
#include
#define int long long
using
namespace std;
const
int n=
1e5+5;
int n,m,t;
int ans[n]
,money[n<<2]
,sum[n<<2]
;struct numbernum[n]
;struct nodeq[n]
,q1[n]
,q2[n]
;inline
bool
cmp(number a,number b)
void
change
(int k,
int l,
int r,
int p,
int v)
int mid=l+r>>1;
if(p<=mid)
change
(k<<
1,l,mid,p,v)
;else
change
(k<<1|
1,mid+
1,r,p,v)
; money[k]
=money[k<<1]
+money[k<<1|
1]; sum[k]
=sum[k<<1]
+sum[k<<1|
1];}
intquery
(int k,
int l,
int r,
int x)
void
solve
(int ql,
int qr,
int l,
int r)
int mid=l+r>>1;
// for (register int i=1; i<=mid; ++i) change(1,1,100000,num[i].p,num[i].l);
while
(twhile
(t>mid)
int p1=
0,p2=0;
for(
register
int i=ql; i<=qr;
++i)
// for (register int i=1; i<=mid; ++i) change(1,1,100000,num[i].p,-num[i].l);
for(
register
int i=
1; i<=p1;
++i) q[ql+i-1]
=q1[i]
;for
(register
int i=
1; i<=p2;
++i) q[ql+p1+i-1]
=q2[i]
;solve
(ql,ql+p1-
1,l,mid)
;solve
(ql+p1,qr,mid+
1,r);}
signed
main()
CTSC 2018 混合果汁
題目鏈結 演算法 對於每組詢問 首先二分答案 顯然 最優策略為優先選擇 低的 建立可持久化線段樹 簡單維護即可 時間複雜度 o nlogn 2 includeusing namespace std define n 100010typedef long long ll typedef long do...
CTSC2018 混合果汁
題目鏈結 luogu loj一道簡單的主席樹 考慮按 d 排序,然後二分乙個答案 x 對 geq x 的 d 建一棵主席樹即可.主席樹上維護兩個資訊 果汁的量和總價.然後在主席樹上二分即可.時間複雜度 o n log 2n 如下 好像才 38 行呢 include include include i...
BZOJ 5343 Ctsc2018 混合果汁
bzoj 5343 ctsc2018 混合果汁 二分答案 主席樹 題意 給出每個果汁的 p,美味度d,最多能放的體積l。定義果汁混合後的美味度為果汁的美味度的最小值。m次詢問,要求花費不大於g,總體積不小於l,求最大美味度,如果不能滿足,輸出 1。二分答案。然後轉變為求 前l小的果汁之和。類似任務查...