zoukankan      html  css  js  c++  java
  • HDU 2795

    题意:有一块矩形板,依次给定高,宽,和要贴的广告条的数量。广告条的高度都是1,宽度依次给定。

    问:假设我们先按照从最上边开始贴,再按照从左边开始贴的顺序贴广告条,输出每条广告条应当贴在哪一行。如果不能贴上,输出-1

    思路:将广告条的行数看作线段树的元素(这里有坑,因为题目所给的10^9次方是不能被记录下来的,但是最多只有200000张纸条所以最多也只有这么多行)。记录每个区间可贴的最长的广告条。

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int h,w,n,tmp;
    bool ok;
    int max(int a,int b)
    {
        if(a>b)
            return a;
        return b;
    }
    struct tr
    {
        int l,r,num;
    };
    tr me[200000<<2];
    void build(int s,int e,int k)
    {
        me[k].l=s;
        me[k].r=e;
        me[k].num=w;
        if(s==e)
        {
            return;
        }
        int m=(s+e)>>1;
        build(s,m,k<<1);
        build(m+1,e,k<<1|1);
    }
    void ans(int k)
    {
        if(me[k].num<tmp||(!ok))
            return;
        if(me[k].l==me[k].r&&ok)
        {
            printf("%d
    ",me[k].l);
            ok=0;
            me[k].num-=tmp;
            return;
        }
        ans(k<<1);
        ans(k<<1|1);
        me[k].num=max(me[k<<1].num,me[k<<1|1].num);
    }
    void solve()
    {
        ok=1;
        scanf("%d",&tmp);
        ans(1);
        if(ok)
            printf("-1
    ");
    }
    int main()
    {
        while(scanf("%d%d%d",&h,&w,&n)!=EOF)
        {
            h=h<n?h:n;
            build(1,h,1);
            for(int i=1;i<=n;i++)
            {
                solve();
            }
        }
        return 0;
    }
  • 相关阅读:
    CF1070F Debate
    P3502 [POI2010]CHO-Hamsters
    CF1421A XORwice
    P2073 送花
    树链剖分边权转化为点权
    球——数学分析,模型构建
    数位dp的模版
    不要62
    智慧题——规律题
    CF551C GukiZ hates Boxes——模拟加二分
  • 原文地址:https://www.cnblogs.com/tun117/p/4525800.html
Copyright © 2011-2022 走看看