P12030 [USACO25OPEN] OohMoo Milk G 题解
dengchengyu · · 题解
显然当
于是约翰的操作就是把最大
显然有一个结论,由于
接下来我们二分一个数
显然时间复杂度为
const int N=1e5+5,mod=1e9+7;
int n,D,A,B,a[N];
signed main(){
read(n,D,A,B);
fo(i,1,n) read(a[i]);
sort(a+1,a+1+n,greater<>());
fo(i,1,A) a[i]+=D;
int l=0,r=2e9,ans=0;
while(l<=r) {
int mid=(l+r)>>1;
int cnt=0;
ll sum=0,res=0;
fo(i,1,A) {
if(a[i]>=mid) {
int del=min(D,a[i]-mid);
sum+=del;
if(del<D) ++cnt;
else res=(res+(ll)(a[i]-D)*(a[i]-D))%mod;
}
else res=(res+(ll)a[i]*a[i])%mod;
}
if(sum>(ll)D*B) {l=mid+1; continue;}
fo(i,A+1,n) res=(res+(ll)a[i]*a[i])%mod;
ll t=min((ll)cnt,(ll)D*B-sum);
if(mid==0) t=0;
res=(res+(ll)mid*mid%mod*(cnt-t))%mod;
res=(res+(ll)(mid-1)*(mid-1)%mod*t)%mod;
ans=res,r=mid-1;
}
write(ans);
return 0;
}