广告牌

来源:互联网 发布:2017年优化设计答案 编辑:程序博客网 时间:2024/04/27 17:56
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int maxn=200005;int h,w;int segTree[maxn*4];void build(int node,int begin,int end){    segTree[node]=w;    if(begin==end)        return;    build(node*2,begin,(begin+end)/2);    build(node*2+1,(begin+end)/2+1,end);}int update(int node,int begin,int end,int val){    if(val>segTree[node])        return 0;    if(begin==end && val<=segTree[node])    {        segTree[node]-=val;        return begin;    }    int r1=update(node*2,begin,(begin+end)/2,val);    if(r1)    {        segTree[node]=max(segTree[node*2],segTree[node*2+1]);        return r1;    }    int r2=update(node*2+1,(begin+end)/2+1,end,val);    if(r2)    {        segTree[node]=max(segTree[node*2],segTree[node*2+1]);        return r2;    }    return 0;}int main(){    //freopen("input.txt","r",stdin);    //freopen("output.txt","w",stdout);    int n;    while(scanf("%d%d%d",&h,&w,&n)!=EOF)    {        memset(segTree,0,sizeof(segTree));        if(h>n)//注意h的范围是10亿,这里只需要存广告的数目就可以了            h=n;        build(1,1,h);        int wi;        for(int k=1;k<=n;k++)        {            scanf("%d",&wi);            int r=update(1,1,h,wi);            if(r)            {                printf("%d\n",r);            }            else            {                printf("-1\n");            }        }    }    return 0;}

 

hdu2795

标签: acm
 3人阅读 评论(0) 收藏 编辑 删除
 分类:

在学校的入口处有一个巨大的矩形广告牌,高为h,宽为w。所有种类的广告都可以贴,比如ACM的广告啊,还有餐厅新出了哪些好吃的,等等。。

在9月1号这天,广告牌是空的,之后广告会被一条一条的依次贴上去。

每张广告都是高度为1宽度为wi的细长的矩形纸条。

贴广告的人总是会优先选择最上面的位置来帖,而且在所有最上面的可能位置中,他会选择最左面的位置,而且不能把已经贴好的广告盖住。

如果没有合适的位置了,那么这张广告就不会被贴了。

现在已知广告牌的尺寸和每张广告的尺寸,求每张广告被贴在的行编号。 
Input 
多组样例,不超过40个。

对每组样例,第一行包含3个整数h,w,n(1 <= h,w <= 10^9; 1 <= n <= 200,000) -广告牌的尺寸和广告的个数。

下面n行每行一个整数 wi (1 <= wi <= 10^9) - 第i张广告的宽度. 
Output 
对每张广告,输出它被贴在的行编号(是1到h之间的数),顶部是第一行。如果某广告不能被贴上,则输出-1。 
Sample Input

3 5 5 




3


0 0