HDU 2795 Billboard

题意:

海报按顺序贴在,可以贴的最左上方。

题解:

最多有min(h,n)行可以贴,那么,每行看成一个节点,用线段树去维护。

//HDU 2795 Billboard
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define MAX 200009*3
struct Node {
    int Max;
    int L,R;
    Node *left;
    Node *right;
};
Node Tree[MAX];
int ans,w,cnt;
void build(int l,int r,struct Node *root) {
    root->Max=w;
    root->L=l;
    root->R=r;
    if(l==r) return;
    int mid=(l+r)/2;
    cnt++;
    root->left=Tree+cnt;
    cnt++;
    root->right=Tree+cnt;
    build(l,mid,root->left);
    build(mid+1,r,root->right);
}
void query(int len,struct Node *root) {
    if(root->Max<len) return;
    if(root->L==root->R) {
        root->Max-=len;
        ans=root->L;
        return ;
    }
    if(root->left->Max>=len) {
        query(len,root->left);
    } else {
        query(len,root->right);
    }
    root->Max=max(root->left->Max,root->right->Max);
}
int main() {
    int n,h;
    while(~scanf("%d %d %d",&h,&w,&n)) {
        cnt=0;
        int tmp=min(h,n);
        build(1,tmp,Tree);
        for(int i=0; i<n; i++) {
            scanf("%d",&tmp);
            ans=-1;
            query(tmp,Tree);
            printf("%d\n",ans);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值