比赛 26暑假集训模拟赛2 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 OohMoo Milk 最终得分 100
用户昵称 zcx 运行时间 0.602 s
代码语言 C++ 内存使用 4.93 MiB
提交时间 2026-07-02 12:45:43
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
const int mod = 1e9 + 7;

int n,a,b,d;
int f[N];
int ans = 0;

int m[N];

bool cmp(int x,int y){
    return x > y;
}

bool check(int x){
    int sum = 0;
    for(int i = 1;i <= a;i++){
        if(m[i] <= x) continue;
        sum += min(m[i] - x,d);
    }
    return (sum <= b * d);
}
signed main()
{
    freopen("Milk.in","r",stdin);
    freopen("Milk.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>d>>a>>b;
    for(int i = 1;i <= n;i++) cin>>m[i];
    sort(m + 1,m + 1 + n,cmp);
    for(int i = a + 1;i <= n;i++) {
        int u = m[i]*m[i];u %= mod;
        ans += u;ans %= mod;
    }
    for(int i = 1;i <= a;i++) m[i] += d;
    int l = 0,r = 1e18;
    while(l < r){
        int mid = (l + r)>>1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    int sum = 0;
    priority_queue<pair<int,int>> q;
    for(int i = 1;i <= a;i++){
        if(m[i] <= l) continue;
        sum += min(m[i] - l,d);
        f[i] = min(m[i] - l,d);
        m[i] -= f[i];
        if(f[i] < d) q.push(make_pair(m[i],i));
    }
//    cout<<sum<<endl;
    sum = b * d - sum;
//    cout<<sum<<endl;
    while(sum--){
        pair<int,int> x = q.top();q.pop();
        int u = x.second;
        m[u]--;f[u]++;
        if(f[u] < d) q.push(make_pair(m[u],u));
    }
    for(int i = 1;i <= a;i++){
        m[i] %= mod;
        ans += (m[i] * m[i] ) % mod;
        ans %= mod;
    }
    cout<<ans<<endl;
    return 0;
}