自2009年以来,A、B站的历史就已经步入了农业变革的黎明期。
在两站的娱乐及音乐区,金坷垃制造业早已得到长足的发展,甚至有些地方还出现了坷垃翻唱的萌芽。
新兴肥料人开始走上历史的舞台。
他们需要新的意识形态,来为他们所追求的肥料辩护;
他们需要新的理念、新的手段,来为金坷垃的生产提供支持。
这样,一种崭新的肥料精神就诞生了。
肥料复兴,是反对肥料粗制滥造,追求创新的新肥料文化的运动。
它必将成为推动金坷垃走得更远、飞得更高的重要力量。
题目背景
题目描述
现在,你有n亩的小麦地需要增产,你拥有一些金坷垃,但是金坷垃极其稀少,掺肥料也只够你撒K次。
众所周知,金坷垃能激活土壤深处的氮磷钾,同一块地可以撒多次肥料,但是效果是有略微衰减的。
实地考察后你发现,第i亩土地第x次撒肥料增产a[i]-x+1公斤。
hzwer将代替你去撒肥料,但是他是个蒟蒻,完全不动大脑,所以你想知道如果他随机撒肥料,最坏情况下小麦将增产多少,最好情况下将增产多少?(他最多只会对第i亩地撒肥料a[i]次)
输入格式
第一行两个整数n,K
第二行n个整数,第i个整数为a[i]
输出格式
输出最大值,最小值,空格隔开
样例数据 1
输入
5 10
10 3 3 1 2
输出
58 26
备注
对于30%的数据n,k<=1000
对于70%的数据n,k<=200000
对于100%的数据n,k,a[i]<=1000000
题解
好像数据很水,两个堆就A了。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define ll long long
#define MAXN 1000002
using namespace std;
int n,m,sizea,sizeb;
int c[MAXN],b[MAXN],a[MAXN];
void weiha(int w)
{
while(w>1)
{int i=w>>1;
if(a[i]<a[w]) swap(a[i],a[w]);
w=i;
}
}
void inserta(int x)
{sizea++; a[sizea]=x; weiha(sizea);}
//-------------------------------------
void weihb(int w)
{
while(w>1)
{int i=w>>1;
if(b[i]>b[w]) swap(b[i],b[w]);
w=i;
}
}
void insertb(int x)
{sizeb++; b[sizeb]=x; weihb(sizeb);}
//------------------------------------------------------------------------------
void heapfya(int w)
{
int l=w<<1,r=l+1,maxw=w;
if(l<=sizea&&a[l]>a[w]) maxw=l;
if(r<=sizea&&a[r]>a[maxw]) maxw=r;
if(maxw!=w)
{swap(a[w],a[maxw]); heapfya(maxw);}
}
void heapfyb(int w)
{
int l=w<<1,r=l+1,minw=w;
if(l<=sizeb&&b[l]<b[w]) minw=l;
if(r<=sizeb&&b[r]<b[minw]) minw=r;
if(minw!=w)
{swap(b[w],b[minw]); heapfyb(minw);}
}
//------------------------------------------------------------------------------
void init()
{
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++)
{scanf("%d",&c[i]);
inserta(c[i]); insertb(c[i]);
}
}
void work()
{
int i;
ll sumax=0,sumin=0;
for(i=1;i<=m;i++)
{sumax+=a[1]; a[1]--; heapfya(1);}
printf("%lld ",sumax);
for(i=1;i<=m;i++)
{sumin+=b[1]; b[1]--;
if(b[1]==0)
{b[1]=b[sizeb]; sizeb--; heapfyb(1);}
}
printf("%lld\n",sumin);
}
int main()
{
init(); work();
return 0;
}