zoukankan      html  css  js  c++  java
  • HDOJ 2795 Billboard

    看了notonlysuccess的博客

    线段树维护最大值,这道题需要注意的是当h>n时,令h = n,原因是如果wi都小于w,最多只用前n行,反之一定结果是-1。

    # include <cstdio>
    
    int h, w, n, wi;
    int m[4 * 200010];
    
    int Max(int x, int y)
    {
        return x > y ? x : y;
    }
    
    void update(int r)
    {
        m[r] = Max(m[r << 1], m[r << 1 | 1]);
    }
    
    void build(int x, int y, int r)
    {
        m[r] = w;
        if (x >= y) return ;
        int mid = (x+y) >> 1, ls = r << 1, rs = r << 1 | 1;
        build(x, mid, ls);
        build(mid+1, y, rs);
        update(r);
    }
    
    void query(int x, int y, int r)
    {
        if (x == y) {m[r] -= wi; printf("%d\n", x); return ;}
        int mid = (x+y) >> 1, ls = r << 1, rs = r << 1 | 1;
        if (m[ls] < wi) query(mid+1, y, rs);
        else query(x, mid, ls);
        update(r);
    }
    
    void solve(void)
    {
        if (h > n) h = n;
        build(1, h, 1);
        while (n--)
        {
            scanf("%d", &wi);
            if (m[1] < wi)
                puts("-1");
            else
                query(1, h, 1);
        }
    }
    
    int main()
    {
        while (~scanf("%d%d%d", &h, &w, &n))
            solve();
        
        return 0;
    }
  • 相关阅读:
    Pyton 练习题2
    Python 知识点练习
    pycharm 汉化
    关于sublime编辑Python的安装与配置
    python练习题
    虚短和虚断
    OSI的7层协议
    5V电压的制作
    三角波,方波,正弦波的转换
    单片机不工作,晶振是否起振怎么检查
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2647037.html
Copyright © 2011-2022 走看看