HDU 2795 Billboard (线段树,单点查询)

HDU 2795


一个h*w的公告牌,要在其上贴公告,尽量往上,同一高度尽量靠左。求第n个广告所在的行数。没有合适的位置贴了则输出-1。

参考博客:http://blog.csdn.net/qiqi_skystar/article/details/50299743


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node {
	int l, r, m;
	int val;
};
int h, w, n;
node T[200100 << 2];
void build(int rt, int l, int r) {
	T[rt].val = w;
	T[rt].l = l;
	T[rt].r = r;
	T[rt].m = (l + r) >> 1;
	if(l == r) return;
	build(rt << 1, l, T[rt].m);
	build(rt << 1 | 1, T[rt].m + 1, r);
}
void query(int rt, int x) {
	if(T[rt].l == T[rt].r) {
		printf("%d\n", T[rt].l);
		T[rt].val -= x;
		return;
	}
	if(x <= T[rt << 1].val) {
		query(rt << 1, x);
	}
	else {
		query(rt << 1 | 1, x);
	}
	T[rt].val = max(T[rt << 1].val, T[rt << 1 | 1].val);
}
int main() {
    while(~scanf("%d %d %d", &h, &w, &n)) {
	    if(h > n) h = n;
	    build(1, 1, h);
	    while(n--) {
	    	int x;
	    	scanf("%d", &x);
	    	if(x > T[1].val) {
	    		printf("-1\n");
			}
			else {
				query(1, x);
			}
		}
	}
    return 0;
}


你可能感兴趣的:(HDU 2795 Billboard (线段树,单点查询))