http://icpc.upc.edu.cn/problem.php?cid=1431&pid=14
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct str
{
long long x,h;
str(long long xx=0,long long hh=0){
x=xx;
h=hh;
}
bool operator < (const str & str1) const
{
if (x==str1.x) return h>str1.h;else return x>str1.x;
}
};
priority_queue<str> q;
long long i,j,k,n,x,t,ans,h;
int main()
{
scanf("%lld%lld",&n,&k);
for (i=1;i<=n;i++)
{
scanf("%lld",&x);
q.push(str(x,0));
}
for (;(n-1)%(k-1);n++)
q.push(str(0,0));
while (q.size()>1)
{
h=x=0;
for (i=1;i<=k;i++)
{
h=max(h,q.top().h);
x+=q.top().x;
q.pop();
}
t+=x;
ans=max(ans,h+1);
q.push(str(x,h+1));
}
printf("%lld\n%lld\n",t,ans);
}