| 比赛 |
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;
}