zoukankan      html  css  js  c++  java
  • hdu 2795 Billboard(线段树)

    题意:有一块h*w 的广告牌用来贴广告

            每个广告 1*w 并且优先贴于左上方

            现在给出n个广告的n 问分别贴于第几行

            贴不了输出 -1

    思路:把1-h 作为 l-r 值 套用线段树模版 

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll __int64
    #define MAXN 1000
    #define INF 0x7ffffff
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    int h,w,n;
    struct Tree
    {
        int l,r;
        int value,idx;
        friend bool operator > (const Tree &a,const Tree &b)
        {
            if(a.value!=b.value)
                return a.value>b.value;
            return a.idx<b.idx;
        }
    }sum[1000000];
    void build(int l,int r,int rt)
    {
        sum[rt].l=l;
        sum[rt].r=r;
        sum[rt].value=w;
        sum[rt].idx=l;
        if(l==r) return ;
        int m=(l+r)>>1;
        build(l,m,rt*2);
        build(m+1,r,rt*2+1);
    }
    int query(int val,int l,int r,int rt)
    {
        if(val>sum[rt].value) return -1;
        if(l==r)
        {
            return sum[rt].idx;
        }
        int m=(l+r)>>1;
        if(sum[rt*2].value>=val) return query(val,l,m,rt*2);
        else return query(val,m+1,r,rt*2+1);
    }
    void update(int l,int r,int val,int rt)
    {
        if(l<=sum[rt].l&&sum[rt].r<=r)
        {
            sum[rt].value-=val;return;
        }
        int m=(sum[rt].l+sum[rt].r)>>1;
        if(l<=m) update(l,r,val,rt*2);
        if(r>m) update(l,r,val,rt*2+1);
        if(sum[rt*2]>sum[rt*2+1])
        {
            sum[rt].value=sum[rt*2].value;
            sum[rt].idx=sum[rt*2].idx;
        }
        else
        {
            sum[rt].value=sum[rt*2+1].value;
            sum[rt].idx=sum[rt*2+1].idx;
        }
    
    }
    int main()
    {
        int i,j;
        int q;
        while(scanf("%d%d%d",&h,&w,&n)!=EOF)
        {
            if(h>n) h=n;
            build(1,h,1);
            while(n--)
            {
                scanf("%d",&q);
                int temp=query(q,1,h,1);
                printf("%d
    ",temp);
                if(temp!=-1)
                {
                    update(temp,temp,q,1);
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    PAT 乙级真题 1013.组个最小数
    PAT 乙级真题 1012.D进制的A+B
    PAT 乙级真题 1011.个位数统计
    PAT 乙级真题 1010.月饼
    PAT 乙级真题 1009.1019.数字黑洞
    PAT 乙级真题 1008.锤子剪刀布
    PAT 乙级真题 1007.A除以B
    PAT 乙级真题 1006.1016.部分A+B
    C++自定义sort函数
    VS2017如何使用scanf函数
  • 原文地址:https://www.cnblogs.com/sola1994/p/3930469.html
Copyright © 2011-2022 走看看