感觉没什么问题啊,WA了7个点,绝了....
#include<bits/stdc++.h>
using namespace std;
#define N 500010
#define ll unsigned long long
ll n,a[N],s[N],k,b[N];
struct node{ll x,s;};
int check(ll mid)
{
ll s=0,s2=0,sp=0,cnt=0;queue<node> q;
for(int i=1;i<=n;i++) a[i]=b[i];
for(int i=n;i>=1;i--)
{
if(!q.empty())
{
node t=q.front();
while((t.x-i)*(t.x-i)>=mid)
{
q.pop();s-=t.x*t.s,s2-=t.x*t.x*t.s,sp-=t.s;
if(q.empty()) break;t=q.front();
}
}
a[i]=a[i]-sp*mid+s2+sp*i*i-2*s*i;
if(a[i]<0) continue;ll tmp=a[i]/mid+1;
s+=i*tmp;s2+=i*i*tmp;sp+=tmp;
cnt+=a[i]/mid+1;q.push((node){i,tmp});
}
// printf("mid=%lld cnt=%lld\n",mid,cnt);
if(cnt<=k) return 1;
else return 0;
}
int main()
{
//freopen("Qiennys.in","r",stdin);
//freopen("Qiennys.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
ll l=1,r=1e10,mid,ans;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans;
return 0;
}