您的位置:首页 > 其它

【HDU】 2795 Billboard(线段树)

2015-02-11 21:36 513 查看
sum表示的是区间的剩余容纳长度

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 200005
#define ls rt<<1
#define rs rt<<1|1
#define mid (l+r)>>1
int sum[MAX << 2];
int h, w, n;
int ww;

void uprt(int rt)
{
sum[rt] = max(sum[ls], sum[rs]);
}

void build(int l,int r,int rt)
{
sum[rt] = w;
if (l == r)
{
return;
}
int m = mid;
build(l, m, ls);
build(m + 1, r, rs);
}

int query(int p, int l, int r, int rt)
{
if (l == r)
{
sum[rt] -= p;
return l;
}
int ans = -1;
int m = mid;
if (p <= sum[ls])
ans = query(p, l, m, ls);
else
if (p<=sum[rs])
ans = query(p, m + 1, r, rs);
uprt(rt);
return ans;
}
int main()
{
while (cin >> h >> w >> n)
{
int k = min(h, n);
build(1, k, 1);
for (int i = 0; i < n; i++)
{
scanf("%d", &ww);
if (ww>sum[1])
printf("-1\n");
else
printf("%d\n", query(ww, 1, k, 1));
/*
写成这样就WA
*/
//printf("%d\n", query(ww, 1, k, 1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: