• hdu 2795 Billboard


    hdu 2795 Billboard

    题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
    思路:总共有h个叶节点,表示有h个区间,线段树的一个域表示该区间还能容纳的最大物品,每次找到最大值的位子(先找左边),然后减去L
    线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)

    #include<iostream>
    #include<algorithm>
    #define MAXN 222222
    using namespace std;
    int p[MAXN*4];
    int query(int k,int x,int s,int t)
    {
    	if(s==t)
    	{
    		p[k]-=x;
    		return s;
    	}
    	int kl=k<<1,kr=kl+1,mid=(s+t)>>1;
    	int ans;
    	if(p[kl]>=x) ans=query(kl,x,s,mid);
    	else ans=query(kr,x,mid+1,t);
    	p[k]=max(p[kl],p[kr]);
    	return ans;
    }
    int main()
    {
    	int h,w,n,len;
    	while(scanf("%d %d %d",&h,&w,&n)==3)
    	{
    		if(h>n)
    			h=n;
    		for(int i=1;i<MAXN*4;i++)
    			p[i]=w;
    		while(n--)
    		{
    			scanf("%d",&len);
    			if(p[1]<len) {
    				puts("-1");
    				continue;
    			}
    			printf("%d\n",query(1,len,1,h));
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    常用git命令
    复制文件
    实现斗地主洗牌、发牌、看牌
    线程池实现多线程
    git无法提交问题
    Js中处理日期加减天数
    form详解
    node.js中exports与module.exports的区别
    css的direction属性
    webstorm基础使用
  • 原文地址:https://www.cnblogs.com/nanke/p/2185373.html
Copyright © 2020-2023  润新知