【线段树】 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值