HDU2795-Billboard(点更点查)

来源:互联网 发布:手机淘宝字体放大 编辑:程序博客网 时间:2024/06/05 11:14

题意:

给出一个高h,宽w的板子,要写n条长为x的广告,问从1->h 可以写在哪个位置。

思路:

第一次写的时候没注意数据 造了个4*h的线段树,果断RE,再想了想n的数据很小,如果依据n来构造线段树,就解决了

在构造的时候注意左,右子树的val值的更新,以及构建当前树是几号,还有就是在当前节点如果max( 左,右) <  我们需要的宽度 就返回-1.


#include <stdio.h>#include <math.h>#include <iostream>#include <algorithm>#define lson i<<1,left,mid#define rson i<<1|1,mid+1,rightusing namespace std;int h,w,n;int ans=0,cnt;struct TreeNode{    int left_val,right_val,val,left,right,num;} Tree[800005];void Build(int i , int left , int right ){    Tree[i].left=left;    Tree[i].right=right;    if(left==right)    {        Tree[i].num=++cnt;        Tree[i].val=w;        return ;    }    int mid=(left+right)>>1;    Build(lson);    Build(rson);    Tree[i].val=max(Tree[i<<1].val,Tree[i<<1|1].val);    Tree[i].left_val=Tree[i<<1].val;    Tree[i].right_val=Tree[i<<1|1].val;}void update(int i,int val){    if(Tree[i].val<val||Tree[i].num>h)    {        ans=-1;        return ;    }    if(Tree[i].left== Tree[i].right )    {        Tree[i].val-=val;        ans=Tree[i].num;        return ;    }    if(val<=Tree[i].left_val)    {        update(i<<1 ,val);    }    else    {        update(i<<1|1 ,val);    }    Tree[i].left_val=Tree[i<<1].val;    Tree[i].right_val=Tree[i<<1|1].val;    Tree[i].val=max(Tree[i<<1].val,Tree[i<<1|1].val);}int main(){    int x;    while(~scanf("%d%d%d",&h,&w,&n))    {        cnt=0;        Build(1,1,n);        while(n--)        {            scanf("%d",&x);            ans=0;            update(1,x);            printf("%d\n",ans);        }    }    return 0;}/*1 5 251*/

0 0