hdu2759 Billbord(线段树)
来源:互联网 发布:磁选机选矿的数据分析 编辑:程序博客网 时间:2024/06/05 14:18
题意:给一个长w宽h的板子,每次往上面贴一个长wi宽1的条子(不可旋转),共n个,每次贴的时候都贴在能贴的最上行的最左端,若贴不下就不贴
给出w,h,wi,n求每个帖子在第几行,若贴不下,输出-1
思路:使用最大值线段树记录每行剩余长度,树叶表示那一行的剩余长度。在每次贴的时候,若wi>根值,则树上所有叶子都比这个帖子小,故挂不下,输出-1。
若h>n,则说明多的行不需要,h=n即可,(所以说题目上的h<1e9是吓人的)(当时这里手滑写成了h<n结果re了一个晚上)
对于每次查询,使用深搜来找,找叶子后把叶子值改了,返回叶子的位置就是贴的行数了
#include<cstdio>#include<algorithm>#include<iostream>using namespace std; struct segn { int mi; }segt[200000*4]; void build(int h,int root,int st,int en) { if(st==en) { segt[root].mi=h; return; } int mid=(st+en)/2; build(h,root*2+1,st,mid); build(h,root*2+2,mid+1,en); segt[root].mi=h; } int adjust_elemt(const int addval,int st,int en,int root) { if(st==en) { segt[root].mi-=addval; return st; } int mid=(st+en)/2,ret; if(segt[2*root+1].mi>=addval) ret=adjust_elemt(addval,st,mid,root*2+1); else ret=adjust_elemt(addval,mid+1,en,root*2+2); segt[root].mi=max(segt[root*2+1].mi,segt[root*2+2].mi); return ret; } int main() { int h,w,n,yes,cur; while(~scanf("%d%d%d",&h,&w,&n)) { if(h>n)h=n; build(w,0,0,h-1); for(int i=0;i<n;i++) {scanf("%d",&cur); if(cur>segt[0].mi)printf("-1\n"); else{yes=adjust_elemt(cur,0,h-1,0);printf("%d\n",yes+1);} } } return 0; }
阅读全文
0 0
- hdu2759 Billbord(线段树)
- hdu2759
- 初识线段树(线段树总结)
- codevs1080线段树练习(线段树)
- poj2777-线段树应用(线段覆盖)
- 线段树(poj2528)
- 线段树(1)
- poj2823(线段树)
- 线段树(1)
- 线段树(2)
- 线段树(4)
- poj2352-------------线段树------------(*)
- hdu2795Billboard(线段树)
- hdu1166(线段树)
- hdu1754(线段树)
- 线段树(SOJ4122)
- 线段树(SOJ2436)
- poj3468(线段树)
- 本人菜鸟,求助,为何不能输出
- 机器学习:决策树--python
- 软件工程(C编码实践篇)主观题总结
- 循环输出
- kuangbin并查集分析
- hdu2759 Billbord(线段树)
- 小函数工具库
- K-Dominant Character CodeForces
- SpringMVC中rest风格以及四种请求方式
- 异常处理
- 在Java中@Override的作用和注意事项
- 部分笔记,备用
- 趣味排序
- c#string类常用方法