hdu 2795 Billboard 线段树
来源:互联网 发布:淘宝是下订单扣钱 编辑:程序博客网 时间:2024/06/07 23:05
题意:
给定一块h*w的黑板,有n个高度为1,宽为xi的广告,每次讲广告贴到尽可能高的位置,在这个位置上贴在尽可能左的位置。如果不能贴输出-1,能贴输出贴的行数。
题解:
我们根据高度建线段树,虽然h<=10^9,但n<=2e5,所以至多有2e5行被用到,所有建树只要建build(1,min(h,n),1)就可以了。树节点中maxv表示的是这段区间内的最大空余,每次贴广告的时候,找最左边的maxv>xi的位置。
代码:
#include <cstdio>#include <cstdlib>#include <cmath>#include <ctime>#include <cstring>#include <iostream>#include <algorithm>#include <map>#include <set>#include <queue>using namespace std;const int maxn=2e5+10;struct node{ int l,r,maxv;}e[maxn*4];int w;void build(int a,int b,int c){ if(a==b) { e[c].l=e[c].r=a; e[c].maxv=w; return ; } int mid=(a+b)/2; build(a,mid,2*c); build(mid+1,b,2*c+1); e[c].l=a; e[c].r=b; e[c].maxv=w;}int update(int c,int val){ if(e[c].l==e[c].r) { e[c].maxv=e[c].maxv-val; return e[c].l; } int ans; if(e[2*c].maxv>=val)ans=update(2*c,val); else ans=update(2*c+1,val); e[c].maxv=max(e[2*c].maxv,e[2*c+1].maxv); return ans;}int main(){ int h,n; while(scanf("%d%d%d",&h,&w,&n)!=EOF) { int i,j,k,x; h=min(h,n); build(1,h,1); for(i=0;i<n;i++) { scanf("%d",&x); if(x>e[1].maxv)printf("-1\n"); else printf("%d\n",update(1,x)); } } return 0;}
0 0
- HDU 2795 Billboard线段树
- HDU 2795 Billboard 线段树
- Billboard HDU 2795 线段树
- HDU 2795 Billboard 线段树
- hdu 2795 Billboard(线段树)
- HDU 2795 billboard 线段树
- HDU 2795 Billboard(线段树)
- HDU 2795 Billboard 线段树
- hdu 2795 Billboard 线段树
- hdu 2795(线段树)Billboard
- HDU 2795 Billboard(线段树)
- HDU--2795--Billboard--线段树
- hdu 2795 Billboard 线段树
- 【线段树】hdu 2795 BillBoard
- hdu 2795 Billboard 线段树
- hdu 2795 Billboard 线段树
- HDU 2795 Billboard(线段树)
- HDU 2795 Billboard(线段树)
- JVM原理和优化详解
- 笔记67--ViewPager+ScrollView+ListView/GridView
- 工厂方法
- oracle中:=与=:的区别
- linux最常用的20条命令
- hdu 2795 Billboard 线段树
- fast parse,soft parse,hard parse的区别
- Sockets编程读书笔记【3】——深入理解类【续】
- ubuntuOS 搭建 Android应用层、framework层、驱动层开发环境
- 不用游标也能遍历记录的sql语句实例
- 函数指针
- linux下firefox/chromium浏览器安装AboubeFlashPlayer
- 类作用域
- 简析POP3_IMAP_SMTP协议的区别_应用场景