| 肥得更高 |
| 难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
|
试题描述
|
|
自2009年以来,A、B站的历史就已经步入了农业变革的黎明期。在两站的娱乐及音乐区,金坷垃制造业早已得到长足的发展,甚至有些地方还出现了坷垃翻唱的萌芽。新兴肥料人开始走上历史的舞台。他们需要新的意识形态,来为他们所追求的肥料辩护;他们需要新的理念、新的手段,来为金坷垃的生产提供支持。这样,一种崭新的肥料精神就诞生了。肥料复兴,是反对肥料粗制滥造,追求创新的新肥料文化的运动。它必将成为推动金坷垃走得更远、飞得更高的重要力量。 |
|
输入
|
|
第一行两个整数n,K
第二行n个整数,第i个整数为a[i] |
|
输出
|
|
输出最大值,最小值,空格隔开
|
|
输入示例
|
|
5 10
10 3 3 1 2 |
|
输出示例
|
|
58 26
|
|
其他说明
|
|
对于30%的数据n,k<=1000
对于70%的数据n,k<=200000 对于100%的数据n,k,a[i]<=1000000 |
最大值可以这么求:模拟k次操作,每次选出最多的a[i]来撒。
最小值可以这么求:模拟k次操作,每次选出最小的a[i]来撒。
然后因为权值范围不大,几个操作都可以O(c)来做。
#include<cstdio> #include<cctype> #include<queue> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i!=-1;i=next[i]) using namespace std; inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } typedef long long ll; const int maxn=1000010; int n,k,cnt,A[maxn],S[maxn]; ll ans1,ans2,t; int main() { n=read();k=read(); rep(i,1,n) S[A[i]=read()]++,t+=A[i]; if(k>t) k=t; int cur=1000000; rep(i,1,k) { while(!S[cur]) cur--; ans1+=cur;S[cur]--;S[cur-1]++; } rep(i,1,n) S[A[i]]=0; rep(i,1,n) S[A[i]]++; rep(i,1,1000000) while(S[i]--) A[++cnt]=i; rep(i,1,1000000) if(A[i]>=k) { ans2+=(ll)k*(A[i]+A[i]-k+1)/2; break; } else { ans2+=A[i]*(A[i]+1)/2; k-=A[i]; } printf("%lld %lld\n",ans1,ans2); return 0; }