HDU2795 Billboard题解

问题不难,简单的线段树模板题,但是有两个地方值得学习

一个是有height和n中小的那个值进行建树,在不影响题意的前提下节省了空间内存

二是在写函数的时候不能指望一个函数解决太多事情,就Update()来说,开始我是把不能存放的情况也加进去,后来出现WA,将函数简化后,把不能放的情况拿出来,简化了代码的复杂程度,也成功AC


程序源代码:

#include

#include
#include
#include
#include
using namespace std;
int height,width,n;
const int MAX=300010;
int tree[MAX*4];
void Build(int node,int left,int right){
    tree[node]=width;
    if(left==right) {return ;}
    int mid=(left+right)/2;
    Build(node*2,left,mid);
    Build(node*2+1,mid+1,right);
}
int Update(int node,int left,int right,int value){
    if(left==right) {tree[node]-=value;return left;}
    int mid=(left+right)/2;
    int temp;
    if(tree[node*2]>=value) temp=Update(node*2,left,mid,value);
    else temp=Update(node*2+1,mid+1,right,value);
    tree[node]=max(tree[node*2],tree[node*2+1]);
    return temp;
}
int main(){
    int length;
    while(~scanf("%d%d%d",&height,&width,&n)){
    height=min(height,n);
    Build(1,1,height);
    while(n--){
        scanf("%d",&length);
    if(tree[1]     else printf("%d\n",Update(1,1,height,length));
    }
    }
    return 0;
}

你可能感兴趣的:(HDU)