2023校赛补题

发布时间 2023-06-04 13:17:46作者: PPXppx

端水大师

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=1e5+5;
const int M=150005;
const int mod=1e9+7;
int n,a[N],b[N];
ll c[N];
ll pre[N],pre2[N];
bool check(ll mid,ll m){
	for(int i=1;i<=n;++i)c[i]=a[i];
	ll tot=pre2[n];
	for(int i=1;i<=n;++i){
		//if(b[i]<=c[i])break;
		ll now_sum1=pre[i]+mid;
		ll now_ave1=now_sum1/i;
		if(now_ave1>c[i+1])continue;
		if(now_ave1<c[i])break;
		ll now_ret1=now_sum1%i;
		for(int j=n;j>i;--j){
			//if(c[j]<=b[j])break;
			ll now_sum2=pre[n]-pre[j-1]-mid;
			ll now_ave2=now_sum2/(n-j+1);
			if(now_ave2<c[j-1])continue;
			if(now_ave2>c[j])break;
			ll now_ret2=now_sum2%(n-j+1);
			ll now_ans=tot-pre2[i]+(1ll*now_ave1*now_ave1*(i-now_ret1))+(1ll*(now_ave1+1)*(now_ave1+1)*now_ret1)-(pre2[n]-pre2[j-1])+(1ll*now_ave2*now_ave2*(n-j+1-now_ret2))+(1ll*(now_ave2+1)*(now_ave2+1)*now_ret2);
			if(now_ans<=m)return true;
		}
	}
	return false;
}
int main() {
	ll x;
	cin>>n>>x;
	ll m=1ll*n*x;
	ll sum=0;
	ll now=0;
	for(int i=1;i<=n;++i){
		a[i]=read();
		sum+=a[i];
		now+=1ll*a[i]*a[i];
	}
	if(now<=m){
		cout<<"0"<<endl;
		return 0;
	}
	int ave=sum/n;
	int ret=sum%n;
	ll minn=0;
	for(int i=1;i<=ret;++i){
		minn+=1ll*(ave+1)*(ave+1);
		b[i]=ave+1;
	}
	for(int i=ret+1;i<=n;++i){
		minn+=1ll*ave*ave;
		b[i]=ave;	
	}
	if(minn>m){
		cout<<"-1"<<endl;
		return 0;
	}
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	for(int i=1;i<=n;++i){
		pre[i]=pre[i-1]+a[i];
		pre2[i]=pre2[i-1]+1ll*a[i]*a[i];
	}
	ll l=1,r=0;
	for(int i=1;i<=n;++i){
		if(a[i]<b[i])r+=(b[i]-a[i]);
	}
	ll ans;
	while(l<=r){
		ll mid=(l+r)/2;
		if(check(mid,m))ans=mid,r=mid-1;
		else l=mid+1;
	}
	cout<<ans<<endl;
    return 0; 
}