csp模擬 骨粉 二分答案 主席樹

2021-09-30 01:27:42 字數 1233 閱讀 6544

傳送門

存在離線做法但我不會。

因為資料範圍可以看出是個二分答案。

對於每次mid,驗證是o(n)的,複雜度總共n^2logn。

我們從簡化驗證的複雜度入手。

因為農作物會自然生長,所以實際上驗證的高度是mid+t(詢問的t)

令v=mid+t;

對於每個作物,要骨粉

我們可以簡單地通過二分計算出前面的和,對於餘數,我們用資料結構維護。

使用主席樹可以做到區間查詢。

完了。

#includeusing namespace std;

#define in read()

#define int long long

int in

while(isdigit(ch))return cnt*f;

} const int n=100003,m=3200003;

int l[m],r[m],size[m],rt[n],sumsuf[n],a[n],b[n],bcnt;

int n,m,x;int id;

int build(int l,int r)return root;

}int insert(int pre,int l,int r,int key)return root;

}int query(int u,int l,int r,int ql,int qr)

bool check(int height,int use)

int pos=l;//cout<

int gu=height/x;

int ans=sumsuf[pos]-(n-pos+1)*gu;int res=height%x;

if(ans<=use)return true;if(res==0)return false;

l=0,r=bcnt;

while(l>1;

if(res>=b[mid])l=mid;

else r=mid-1;

} if(l)

// cout<

for(register int i=1;i<=n;i++)b[++bcnt]=a[i]%x;

sort(b+1,b+bcnt+1);bcnt=unique(b+1,b+bcnt+1)-b-1;

rt[n+1]=build(1,bcnt);

for(register int i=n;i>=1;i--)cout<

} return 0;

}

Work 線段樹 二分答案

開始也想到二分,但是無法判斷哪些天數比它大,比它小 排序啊,人按浪費的時間排序,題按時間排序,下標加入線段樹 include define n 200005 define ll long long using namespace std int m,n,ans n mid,cnt n 4 時間總和 ...

hdu 6621 主席樹 二分

題意 給乙個陣列a,每次詢問,給定l,r,p,k,求 l r 中的數與p做差的絕對值的第k小。思路 對陣列a建立主席樹 不用離散化 對於每次詢問,二分答案,如果 l r 區間中的 p mid p mid 範圍內的數大於k,則說明二分的答案偏大,需要縮小區間 如果等於k,也需要縮小,因為要找到精確的值...

bzoj2653 二分 主席樹

對於每乙個詢問二分答案。設當前答案為x,將 x的數的權值設為1,當 b 1,c 1 的權值和 a,b 權值和最大的字尾 c,d 權值和最大的字首 0時x可行。先對每個數離散,然後以每個值建立主席樹記錄區間和 最大字首 最大字尾就可以了。時間複雜度 o n log3n 1 include2 inclu...