hdu2795(线段树单点更新)

原创 2013年12月03日 11:19:18

题目链接:hdu2795

/*线段树单点更新,求区间最大值
题目大意:有一块板子,长宽分别为W,H,然后有n块1*w海报
让你把这n快海报贴在这块板子上,尽量往板子的上方贴,同一行尽量往板子的左边贴。
对于第i块海报如果能够贴下则输出能贴在第几行,否则输出-1。

思路:利用线段树求区间的最大值;
maxx表示区间内能贴的海报的最大宽度
建树的时候要注意,heigh的范围特别大
当heigh>=m(m是海报的数量),要用m来建树
*/
#include<cstdio>
#include<algorithm>
using namespace std;

#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int N = 200005;
int sum[N<<2];//表示某行能贴的海报的宽度
void build(int wide, int l, int r, int rt)
{
    sum[rt] = wide;//初始化为wide,最开始板上未贴海报
    if(l == r) return ;
    int m = (l+r) >> 1;
    build(wide, lson);
    build(wide, rson);
}
void update(int num, int pos, int l, int r, int rt)
{
    if(l == pos && r == pos)
    {
        sum[rt] -= num;//该行贴上一个宽为num的海报
        return ;
    }
    int m = (l + r) >> 1;
    if(pos <= m) update(num, pos, lson);
    if(m < pos) update(num, pos, rson);
    sum[rt] = max(sum[rt<<1], sum[rt<<1|1]);//更新父节点
}
int query(int num, int l, int r, int rt)
{
    if(sum[rt] < num) return -1;
    if(l == r) return l;
    int m = (l + r) >> 1;
    if(sum[rt<<1] >= num)
        return query(num, lson);
    else
        return query(num, rson);
}
int main()
{
	int i,n,heigh,wide,num;
	while(~scanf("%d%d%d",&heigh,&wide,&n))
	{
	    heigh = min(heigh, n);
	    build(wide, 1, heigh, 1);
	    while(n--)
	    {
	        scanf("%d",&num);
	        int pos = query(num, 1, heigh, 1);
	        if(pos == -1) printf("-1\n");
	        else
	        {
	            printf("%d\n",pos);
	            update(num, pos, 1, heigh, 1);
	        }
	    }
	}
	return 0;
}


相关文章推荐

线段树单点更新 HDU 2795

只要找到最大的就可以了,并返回 Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K...
  • ZCR_7
  • ZCR_7
  • 2014年09月22日 21:53
  • 406

HDU-2795-Billboard-线段树单点更新

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 好吧,写了这么多单点更新的题目,这样的就很简单了,不过我第一次用这样的风格写代码;向这种简短风格...
  • wlxsq
  • wlxsq
  • 2015年07月30日 10:23
  • 615

HDU 2795 Billboard【线段树好题,单点更新】

题意:有个公告板,大小为h*w,要贴n张公告,每个公告的长度是k,高度固定为1,公告放的要尽可能靠上并尽可能靠左,依次给出一张公告,要求这个公告在满足要求的情况下放在了第几层。 思路:按照线段树的做法...

HDU2795线段树之单点更新

点击打开链接 题意:在一块h*w的矩形板上,要求贴1*Wi的广告,尽量往左往上的贴广告,如果贴不上的话,输出-1;否则输出这个小广告贴在了第几行上。分析:可以用线段树保存每一行的长度,贴上广告之后便...
  • Dan__ge
  • Dan__ge
  • 2016年03月09日 19:30
  • 319

HDU2795:Billboard(线段树单点更新)

Problem Description At the entrance to the university, there is a huge rectangular billboard of size...

HDU 2795 Billboard (线段树 单点更新, 询问位置)

题目大意: 就是h*w的板, 每次向上面空白位置贴1*w的条(不能旋转) 问每次贴能找到的最上面的位置 大致思路: 线段树练习题, 刷刷刷 代码如下: Result  : ...

hdu 2795 Billboard(线段树+单点更新)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 Billboard 题目大意:有一块尺寸为h*w的矩形长板,要在上面贴1*wi的海报n张。海报贴...

HDU2795 Billboard(线段树单点更新,区间最大值)

题目: Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth...

HDU 2795 Billboard 线段树单点更新

Billboard Problem Description At the entrance to the university, there is a huge rectangul...
  • Mrx_Nh
  • Mrx_Nh
  • 2017年04月11日 17:23
  • 84

HDU 2795 Billboard (线段树单点更新)

Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu2795(线段树单点更新)
举报原因:
原因补充:

(最多只允许输入30个字)