hdu2795Billboard(线段树)

来源:互联网 发布:淘宝怎么登录不上去 编辑:程序博客网 时间:2024/05/11 19:07

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2795

题目大意就是给你一个h*w的广告牌,一个广告牌有1*wi 的长度广告牌要求在最左端最上端,问你每输入一个广告牌,它的位置在哪

这道题就是一个线段树的最大值了,每次都减一下就好了。

AC代码:

#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn = 222222;  int MAN[maxn<<2];int h,w,n;void pushup(int rt){MAN[rt]=max(MAN[rt<<1],MAN[rt<<1|1]);}void build(int l,int r,int rt){MAN[rt]=w;if(l==r)return;int m=(l+r)>>1;build(lson);build(rson);}int query(int x,int l,int r,int rt){int ret;if(l==r){MAN[rt]=MAN[rt]-x;return l;}int m=(l+r)>>1;ret=(MAN[rt<<1]>=x) ? query(x,lson):query(x,rson);pushup(rt);return ret;}int main(){while(~scanf("%d%d%d",&h,&w,&n)){if(h>n) h=n;build(1,h,1);while(n--){int x;scanf("%d",&x);if (MAN[1] < x) puts("-1");              else printf("%d\n",query(x , 1 , h , 1)); }}}


0 0
原创粉丝点击