博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2795 Billboard (线段树单点更新求区间最值)
阅读量:6096 次
发布时间:2019-06-20

本文共 1344 字,大约阅读时间需要 4 分钟。

题意

在矩形广告牌上塞广告,每个广告宽为w高为1,规则从上至下,从左至右塞,塞不进去输出-1

思路

对广告牌高度建线段树,维护高度区间剩余宽度最大值,线段树查找可以塞的位置,并更新那个位置的剩余宽度,注意到h可能很大,但其实n只有200000,所以我们最多只需要建200000就可以了,因为如果这200000的高度如果还塞不进去后面的肯定也塞不进去了。

1 #define IO std::ios::sync_with_stdio(0); 2 #include 
3 #define iter ::iterator 4 using namespace std; 5 typedef long long ll; 6 typedef pair
P; 7 #define pb push_back 8 #define se second 9 #define fi first10 #define rs o*2+111 #define ls o*212 const int N=2e5+5;13 int n,m,q,ans;14 int maxv[N*4];15 void build(int o,int l,int r){16 if(l==r){17 maxv[o]=m;18 return;19 }20 int m=(l+r)/2;21 build(ls,l,m);22 build(rs,m+1,r);23 maxv[o]=max(maxv[ls],maxv[rs]);24 }25 void query(int o,int l,int r,int v){26 if(maxv[o]
=v){28 maxv[o]-=v;29 ans=l;30 return;31 }32 int m=(l+r)/2;33 if(maxv[ls]>=v)query(ls,l,m,v);34 else if(maxv[rs]>=v)query(rs,m+1,r,v);35 maxv[o]=max(maxv[ls],maxv[rs]);36 }37 int main(){38 while(~scanf("%d%d%d",&n,&m,&q)){39 n=min(n,q);40 build(1,1,n);41 while(q--){42 int x;43 scanf("%d",&x);44 ans=-1;45 query(1,1,n,x);46 printf("%d\n",ans);47 }48 }49 }

 

转载于:https://www.cnblogs.com/ccsu-kid/p/10606934.html

你可能感兴趣的文章
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>
代码描述10313 - Pay the Price
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
vb sendmessage 详解1
查看>>
jquery用法大全
查看>>
Groonga 3.0.8 发布,全文搜索引擎
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>