您的位置:首页 > 其它

Code[VS] 3377 接水问题2

2015-03-03 18:51 211 查看
先从大到小排序,然后小根堆队首更新下放,最后取最大

#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

const int M=100010;
const int N=1000001;

int n,m,w
;
int h[M],res;

void qs(int l,int r)
{
int i=l,j=r,mid=w[l+r>>1];
for (;i<=j;)
{
for (;mid<w[i];i++);
for (;w[j]<mid;j--);
if (i<=j)
{
if (i^j)
w[i]^=w[j]^=w[i]^=w[j];
i++,j--;
}
}
if (i<r) qs(i,r);
if (l<j) qs(l,j);
}

int max(int i,int j)
{
return i>j?i:j;
}

void push_down(int now)
{
for (;now<<1<=m;)
{
int t=now<<1,t1=now<<1|1;
if (h[now]<h[t]&&(m<t1||h[now]<h[t1])) break;
if (m<t1||h[t]<h[t1])
{
h[now]^=h[t]^=h[now]^=h[t];
now=t;
}
else
{
h[now]^=h[t1]^=h[now]^=h[t1];
now=t1;
}
}
}

int main(void)
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&w[i]);
qs(1,n);

for (int i=1;i<=n;i++)
{
h[1]+=w[i];
push_down(1);
}

for (int i=1;i<=m;i++) res=max(res,h[i]);
printf("%d\n",res);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: