HDU 2795.Billboard-完全版线段树(区间求最值的位置、区间染色、贴海报)
2024-08-30 03:45:20
HDU2795.Billboard
这个题的意思就是在一块h*w的板子上贴公告,公告的规格为1*wi ,张贴的时候尽量往上,同一高度尽量靠左,求第n个公告贴的位置所在的行数,如果没有合适的位置贴则输出-1。
因为题意说尽量往上往左,所以线段树存区间的最大值,就是这段区间内的某行是有最大的空位长度,每输入一个长度,就查询子树就可以。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=*1e5+;
const int inf=0x3f3f3f3f;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int h,w,n;
int MAX[maxn<<];
void PushUp(int rt){
MAX[rt]=max(MAX[rt<<],MAX[rt<<|]);
}
void build(int l,int r,int rt){
MAX[rt]=w;
if(l==r)return ;
int m=(l+r)>>;
build(lson);
build(rson);
}
int query(int x,int l,int r,int rt){
if(l==r){
MAX[rt]-=x;
return l;
}
int m=(l+r)>>;
int ret=(MAX[rt<<]>=x)?query(x,lson):query(x,rson);
PushUp(rt);
return ret;
}
int main(){
while(~scanf("%d%d%d",&h,&w,&n)){
if(h>n) h=n;
build(,h,);
while(n--){
int x;
scanf("%d",&x);
if(MAX[]<x)printf("-1\n");
else printf("%d\n",query(x,,h,));
}
}
return ;
}
最新文章
- 使用nginx-http-concat添加nginx资源请求合并功能
- StringBuffer类的方法
- Java二维码登录流程实现(包含短地址生成,含部分代码)
- springMVC3学习(八)--全球异常处理
- SQL Server 模式和名称解析
- 【.NET】XML文件的创建,修改,删除
- cocos2d-x 获得系统语言繁体
- 通过ssh远程ipython notebook登录使用服务器
- Linux指令--/etc/group文件
- SublimeText 自带格式化代码功能
- Ansible运维工具
- VS2013 生成时复制文件或目录到指定目录
- Java线程的状态分析
- Javascript中点击(click)事件的3种写法
- mysql的checkpoint
- Silverlight &; Blend动画设计系列七:模糊效果(BlurEffect)与阴影效果(DropShadowEffect)
- ActiveX界面已显示,调用方法报undefined的处理办法
- JS高程3:JSON
- 吐血分享:QQ群霸屏技术教程之霸屏实施细则
- Quartz,启动不立即执行问题