大膜求进!!!
查看原帖
大膜求进!!!
488775
Cuiyi_SAI楼主2021/8/5 13:57
#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;
} 

没有抄题解,只是看了看第一篇的思想,怕自己搞错变量名都没改,跟着题解的思路打了一遍,咋一交上去江南一片红?

2021/8/5 13:57
加载中...