zoukankan      html  css  js  c++  java
  • 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;
    } 
    
    欢迎评论交流!
  • 相关阅读:
    实验四 决策树算法及应用
    实验三 朴素贝叶斯算法及应用
    实验二 K-近邻算法及应用
    实验一 感知器及其应用
    实验三 面向对象分析与设计
    实验二 结构化分析与设计
    实验一 软件开发文档与工具的安装与使用
    ATM管理系统
    活动图与流程图的区别与联系
    四则运算题目生成程序
  • 原文地址:https://www.cnblogs.com/alking1001/p/11316608.html
Copyright © 2011-2022 走看看