【线段树】 HDOJ 2795 Billboard

简单的线段树,线段树记录每一条线段中的最大值,不能记录线段中剩余的和。。。。。

#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 200005
#define eps 1e-6
#define mod 200000007
#define INF 99999999
#define lowbit(x) (x&(-x))
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
typedef long long LL;
using namespace std;

LL segtree[maxn<<2];
LL h, w, n;
LL ans, ok;
LL cnt;

void pushup(LL o)
{
	segtree[o]=max(segtree[o<<1], segtree[o<<1 | 1]);
}
void build(LL o, LL L, LL R)
{
	if(L==R){
		segtree[o]=w;
		return;
	}
	LL mid=(R+L)>>1;
	build(lson);
	build(rson);
	pushup(o);
}
void updata(LL o, LL L, LL R)
{
	if(segtree[o]<cnt) return;
	if(L==R){
		ans=L;
		ok=1;
		segtree[o]-=cnt;
		return;
	}
	LL mid=(R+L)>>1;
	if(segtree[o<<1]>=cnt) updata(lson);
	else updata(rson);
	pushup(o);
}
void solve(void)
{
	while(n--){
		scanf("%I64d",&cnt);
		ok=0;
		updata(1, 1, h);
		if(ok) printf("%I64d\n", ans);
		else printf("-1\n");
	}
}
int main(void)
{
	while(scanf("%I64d%I64d%I64d",&h,&w,&n)!=EOF){
		if(h>n) h=n;
		build(1, 1, h);
		solve();
	}
	return 0;
}


你可能感兴趣的:(线段树,HDU)