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; }
相关文章推荐
- Codevs 3377 接水问题2
- 【贪心】CODE[VS] 3377 [Mz]接水问题2 (模拟+优先队列(堆))
- Codevs 1127 接水问题&&3377 [Mz]接水问题2
- [CODEVS1116]四色问题
- Code[VS] 1295 Nqueens N皇后问题
- CODE[VS]1116 四色问题
- codevs1014 装箱问题(DP)
- 遍历问题[CODEVS1029]解题报告
- CODE[VS] 1295 N皇后问题
- Code[vs]1014 装箱问题
- Code[VS] 1029 遍历问题
- code vs 1029 遍历问题 区间dp
- VS部署中的ProductCode问题
- CODE[VS] 1116 四色问题
- CODE[VS] 1116 四色问题
- codevs N皇后问题 回溯法
- codevs (wikioi)1029遍历问题
- CODE[VS]_1214 线段覆盖问题
- codevs1282 约瑟夫问题
- CODE[VS] 1016 税收与补贴问题