hdu 2795 billboard题解

来源:互联网 发布:尼龙粘扣 知乎 编辑:程序博客网 时间:2024/06/18 13:16

刚开始看到题总不知道要维护什么?估计是因为我弱爆了。。。。
维护区间的最大值,先走左子树,

#include <stdio.h>#define maxx(X,Y) ((X)>(Y)?(X):(Y))int tree[800003],h,w,n;int find(int tn,int left,int right,int wi){    int mid,res;    if(left==right) {tree[tn]-=wi;return left;}    mid=(left+right)>>1;    if(tree[tn<<1]>=wi) res= find(tn<<1,left,mid,wi);    else res=find(tn<<1|1,mid+1,right,wi);    tree[tn]=maxx(tree[tn<<1],tree[tn<<1|1]);    return res; }int main(int argc, char const *argv[]){    int wi,i;    while(scanf("%d %d %d",&h,&w,&n)==3){    if(h>n) h=n;    for(i=1;i<(h<<2);i++)   tree[i]=w;//相当于建树    for(i=0;i<n;i++)    {        scanf("%d",&wi);        if(wi>tree[1]) puts("-1");        else printf("%d\n",find(1,1,h,wi) );    }}    return 0;}
0 0