• Billboard 题解 hdu2795


    Billboard 题解 hdu2795

    题意

    有个广告牌,上面需要依次贴广告,广告的高度均为1,但是宽度不同,每次都想贴在最靠左上的位置,按照顺序进行广告的话,输出每个广告位于广告牌的高度。

    解题思路

    使用线段树,来维护区间最大值,这样我们每次查找的时候都先判断上面点的最大值是不是大于广告的宽度,根据题意大于就先判断左节点,左节点不行再右节点,然后找到具体的点。如果小于的话,那个这个节点和他下面的节点就都不行了。

    下面代码,基本上就是线段树的模板,就是维护区间的最大值这个是重点。

    代码实现

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=2e5+7;
    int a[maxn<<2];
    int h, w, n, ans;
    void up(int rt)
    {
    	a[rt]=max(a[rt<<1], a[rt<<1|1]);
    }
    void update(int rt, int l, int r, int x)
    {
    	if(l==r){
    		a[rt]-=x;//表示在高度为rt处,贴完广告后剩下的宽度
    		ans=l;
    		return;
    	}
    	int mid=(l+r)>>1;
    	if(a[rt<<1] >= x) update(rt<<1, l, mid, x); //先看左节点是否可以
    	else update(rt<<1|1, mid+1, r, x);
    	up(rt); //记得更新当前节点的最大值
    }
    int main()
    {
    	while(scanf("%d%d%d", &h, &w, &n)!=EOF)
    	{
    		int R=min(h,n);
    		for(int i=1; i<=(R<<2); i++)
    		{
    			a[i]=w; //这里相当于建立线段树,因为开始肯定都是宽度w了
    		}
    		int wi;
    		for(int i=1; i<=n; i++)
    		{
    			scanf("%d", &wi);
    			if(a[1] < wi) printf("-1
    ");//a[1]维护的是整个区间的最大值,这个如果都不满足的话,就可以输出-1了。
    			else 
    			{
    				update(1, 1, R, wi);
    				printf("%d
    ", ans);
    			}
    		}
    	}
    	return 0;
    } 
    
    欢迎评论交流!
  • 相关阅读:
    开发模式的问题
    day70-springmvc day75-springmvc 2springmvc架构
    09-SSH综合案例:前台用户模块:注册功能实现
    Win10不可不知的常用技巧,建议收藏!
    Win10不可不知的常用技巧,建议收藏!
    Win10不可不知的常用技巧,建议收藏!
    Jquery操作CSS常用方法
    Jquery操作CSS常用方法
    Jquery操作CSS常用方法
    前端必备知识点—SVG
  • 原文地址:https://www.cnblogs.com/alking1001/p/11316608.html
Copyright © 2020-2023  润新知