#include <bits/stdc++.h>
using namespace std;
long long N,K,mi[500001],num[500001]={0},ANS,L,R;
bool check(long long p)
{
long long over=(long long )sqrt(p)+1;
long long cnt=0,plus=0,i=0,i2=0;
for(long long j=N;j>=1;j--)
{
if(num[j+1])
{
plus+=num[j+1];
i+=num[j+1]*(j+1);
i2+=num[j+1]*(j+1)*(j+1);
}
if((j+over<=N)&&(num[j+over]))
{
plus-=num[j+over];
i-=num[j+over]*(j+over);
i2-=num[j+over]*(j+over)*(j+over);
}
long long all=1ll*plus*p-1ll*j*j*plus+2ll*i*j+i2;
if(mi[j]>=all)
{
num[j]=(mi[j]-all)/p+1;
cnt+=num[j];
}
if(cnt>K)
return false;
}
return true;
}
long long search(long long l,long long r)
{
long long mid;
while(l<=r)
{
mid=l+(r-l)/2;
if(check(mid))
{
ANS=mid;
r=mid-1;
}
else
l=mid+1;
}
return ANS;
}
int main()
{
scanf("%lld%lld",&N,&K);
for(long long i=1;i<=N;i++)
scanf("%lld",&mi[i]);
L=1;
R=1e14;
search(L,R);
printf("%lld",ANS);
return 0;
}
没有抄题解,只是看了看第一篇的思想,怕自己搞错变量名都没改,跟着题解的思路打了一遍,咋一交上去江南一片红?