HDU - 2795 Billboard(线段树)
题目链接:点击查看
题目大意:给定一个高度为h,宽度为w的广告牌,接下来以此给出n个高度为1,宽度为w的广告,我们需要将广告优先贴在最上边、最左边,问给出的每一个广告应该贴在哪一行,若没有位置贴了则输出-1
题目分析:这个题一开始分析的是线段树,然后以h和n的最小值建树,因为假如h特别大,那么n个广告即使一行一个最多也才需要n行,剩下的n+1行到h行都浪费了,反过来也一样,如果h特别小,那么n个广告肯定也贴不下,所以我们要选n和h的较小值来建树。下面我们应该分析怎样建树,就是线段树中应该储存什么,我一开始想的是储存剩余的空间,然后求区间和处理,但是顺着想下去发现没有办法判断具体是哪一个区间满足条件,也有可能顺着递归下去却发现没有答案,这可把我难受坏了,后来憋不住了,去网上看了题解才发现这是个很简单的裸的最大值的线段树,随后一想确实是这个样子,但是为什么自己想的时候却想不到呢?不过总体思路就是维护一个最大值的线段树了,上代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;int h,w,n;struct Node
{int l,r,max;
}tree[N<<2];void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;tree[k].max=w;if(l==r)return;int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}int query(int k,int val)
{if(tree[k].max<val)return -1;if(tree[k].l==tree[k].r){tree[k].max-=val;return tree[k].l;}int ans;if(tree[k<<1].max>=val)ans=query(k<<1,val);elseans=query(k<<1|1,val);tree[k].max=max(tree[k<<1].max,tree[k<<1|1].max);return ans;
}int main()
{
// freopen("input.txt","r",stdin);while(scanf("%d%d%d",&h,&w,&n)!=EOF){if(h>n)h=n;build(1,1,h);while(n--){int x;scanf("%d",&x);printf("%d\n",query(1,x));}}return 0;
}
HDU - 2795 Billboard(线段树)相关推荐
- HDU 2795 Billboard (线段树+贪心)
HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...
- HDU 5861 Road 线段树区间更新单点查询
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...
- hdu 3308 LCIS 线段树 + 区间合并
传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...
- hdu 4747 mex 线段树+思维
http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...
- hdu 1542 Atlantis (线段树+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...
- YJJ's Salesman HDU - 6447(线段树 单点更新+DP思想)
YJJ's Salesman 题目链接:HDU - 6447 题意:一个1e9*1e9的地图,要求由(0, 0) -> (1e9, 1e9):只能向下,向右, 向右下移动:地图中有n个点,有宝藏 ...
- HDU 4288 Coder [线段树]
维护一个可以插入删除的有序序列,每次询问序列中位置mod5=3的数的和. CodeForces原题,因为时限给的太宽,数据太水,STL可以暴力过. 用线段树和平衡树都可以做这题,线段树需要先离散化,然 ...
- hdu 1540(线段树单点更新 区间合并)
解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改 lsum:从这个区间的左端点往右能够找到的最大连续区间: rsum:从这个区间的右端点 ...
- hdu 1255(线段树求重叠面积)
扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...
最新文章
- 【noi 2.5_8465】马走日(dfs)
- js基础篇——localStorage使用要点
- 【LeetCode】3月28日打卡-Day13
- 分享实录 | 企业CICD规模化落地浅析
- notepad++配置Zen Coding
- 计算机组成原理 第五章 中央处理器
- java笔试必考知识_面试必备:常考Java基础知识总结(持续更新)
- JavaParse入门
- Java根据出生日期计算(判断)星座
- 一分钟了解光纤、单模光纤、多模光纤
- 基于python语言设计的词云定制器
- 从外包月薪5K到阿里月薪15K,大厂面试必备技能
- css好看常用的中文字体
- 再探矩阵求逆引理 : Woodbury恒等式的证明
- 绘声绘影导出视频过大
- CODING 敏捷实战系列课第三讲:可视化业务分析
- 魔乐科技安卓开发教程----李兴华----03菜单
- 远程连接工具---mstsc单文件版兼容64位
- steam下载地址,千万别搞错!
- Android : Resource is not a Drawable (color or path)