hdu 2795 Billboard

本文讨论了如何使用线段树进行单点更新操作,通过实例代码演示了求解过程,包括构建树、查询最大值和更新值等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题还是线段树单点更新的题目。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

#include <iostream> #include <cstdio> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxx=200002; int maxn[maxx<<2];hdu int h,w,n; int max(int a,int b){ return a>b?a:b; } void build(int l,int r,int rt){ maxn[rt]=w; if(l==r) return ; int m=(l+r)>>1; build(lson); build(rson); } int query(int wi,int l,int r,int rt){ if(l==r){ maxn[rt] -= wi; return r; } int m=(l+r)>>1; int ret=0; if(maxn[rt<<1]>=wi) ret=query(wi,lson); else ret = query(wi,rson); maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]); return ret; } int main(){ while(scanf("%d%d%d",&h,&w,&n)!=EOF){ int wi; if(h>n)h=n; build(1,h,1); while(n--){ scanf("%d",&wi); if(wi>maxn[1])printf("-1\n"); else printf("%d\n",query(wi,1,h,1)); } } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值