救命,本地AC
查看原帖
救命,本地AC
251882
蒟蒻丁楼主2020/7/25 09:31
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
#define N 1000010
using namespace std;
ll n,m,cnt,a[N],num[N],l=1,r=1e14,ans,pls,i,i2;

bool check(ll x){
	ll over=sqrt(x)+1,cnt=0;
	pls=0,i=0,i2=0;
	memset(num,0,sizeof num);
	for(ll j=n;j>=1;j--){
		if(num[j+1]){
			pls+=num[j+1];
			i+=num[j+1]*(j+1);
			i2+=num[j+1]*(j+1)*(j+1);
		}
		if(((j+over)<=n)&&num[j+over]){
			pls-=num[j+over];
			i-=num[j+over]*(j+over);
			i2-=num[j+over]*(j+over)*(j+over);
		}
		ll ah=1ll*pls*x-i2+2ll*i*j-1ll*pls*j*j;
		if(ah<=a[j]){
			num[j]=(a[j]-ah)/x+1;
			cnt+=num[j];
		}
		if(m<cnt)return 0;
	}
	return 1;
}

int main(){
	//freopen("C:/zez.txt","r",stdin);
	scanf("%llld%lld",&n,&m);
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	while(l<=r){
		ll mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	cout<<ans;
}
2020/7/25 09:31
加载中...