比较裸的二分,但是比赛的时候脑抽,用树状数组瞎搞过了,但是边界条件没注意让hack了。
后来看到有人写了很简单的版本,又过了一遍,提醒一下自己不能忘记基本算法。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; typedef long long ll; int a[100005],b[100005],sum[100005]; int n,m,k; bool judge(int mid) { int step=m,add=0; memset(sum,0,sizeof(sum)); for(int i=0;i
>n>>m>>k) { int minn=1e9; int maxx=0; for(int i=0;i
>a[i]; minn=min(minn,a[i]); maxx=max(maxx,a[i]); } int low=minn,high=m+maxx; int ans=minn; while(low<=high) { int mid=(low+high)>>1; if(judge(mid)) { ans=max(ans,mid); low=mid+1; } else high=mid-1; } cout<