CTSC2018 混合果汁

2021-10-08 21:34:24 字數 1848 閱讀 3267

為何要用整體二分,整體二分應該怎樣二分,和[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小的果汁之和。類似任務查...