标签:des style color java os io strong for
3 5 5 2 4 3 3 3
1 2 1 3 -1线段树问题,给出h*w的广告版,每一个广告是1*w的,给出m个广告,要每张广告尽量在上层尽量靠左,输出它所在的高度,如果放不下,就输出-1这里的问题就是h给的很大,但是 一共只有m个广告,所以即使是一条广告占一条,那么也就只需要m的高度,多余的高度没有用,如果m的高度的不能放下m条广告,那么即使h再高,也放不下,所以n应该是m和h的小值,一段存储下它所控制的区间的最大值,只要最大值大于广告wi,那么第i条广告就可以放到这个区间内。先判断左子树,左子树不合适后判断右子树,除非是当前的wi大于整段的最大值,否则一定可以放到广告版内,注意,在放入一个广告之后,修改所有的父节点的最大值。#include <cstdio> #include <cstring> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; #define maxn 300000 #define lmin 1 #define rmax n #define lson l,(l+r)/2,rt<<1 #define rson (r+l)/2+1,r,rt<<1|1 #define root lmin,rmax,1 #define now l,r,rt #define int_now int l,int r,int rt int cl[maxn<<2] , k[maxn<<2] , top ; void push_up(int_now) { cl[rt] = max( cl[rt<<1], cl[rt<<1|1] ) ; } void creat(int w,int_now) { if( l != r ) { creat(w,lson); creat(w,rson); push_up(now); } else { cl[rt] = w ; k[rt] = ++top ; } } int update(int w,int_now) { int ans ; if( cl[rt] < w ) return -1 ; if( l == r && cl[rt] >= w ) { cl[rt] -= w ; return k[rt] ; } else { if( cl[rt<<1] >= w ) ans = update(w,lson); else ans = update(w,rson); push_up(now); return ans; } } int main() { int i , n , w , m ; while(scanf("%d %d %d", &n, &w, &m)!=EOF) { top = 0 ; n = min(n,m); creat(w,root); while(m--) { scanf("%d", &w); printf("%d\n", update(w,root)); } } }
hdu2795Billboard(线段树,找第一个大于w的点),布布扣,bubuko.com
hdu2795Billboard(线段树,找第一个大于w的点)
标签:des style color java os io strong for
原文地址:http://blog.csdn.net/winddreams/article/details/38454789