HDU 2795 Billboard(线段树单点更新)

来源:互联网 发布:iis7怎么执行php 编辑:程序博客网 时间:2024/04/26 12:50

题意: h*w的木板, 放进一些1*L的物品, 求每次放的可以放的最上面的位置, 放了之后就占据相应的位置

思路: 维护1-h线段的线段树 每段长w 然后不断维护区间的最大值  查询的时候优先往左儿子(相当于向上)

          然后就是单点更新的裸题了

代码:

////  Created by TaoSama on 2015-09-18//  Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << "  "#define prln(x) cout << #x << " = " << x << endlconst int N = 2e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;int w, n, q;#define root 1, n, 1#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1int maxv[N << 2];void push_up(int rt) {    maxv[rt] = max(maxv[rt << 1], maxv[rt << 1 | 1]);}void build(int l, int r, int rt) {    maxv[rt] = w;    if(l == r) return;    int m = l + r >> 1;    build(lson);    build(rson);}int query(int v, int l, int r, int rt) {    if(l == r) {        maxv[rt] -= v;        return l;    }    int m = l + r >> 1;    int ret = maxv[rt << 1] >= v ? query(v, lson) : query(v, rson);    push_up(rt);    return ret;}int main() {#ifdef LOCAL    freopen("in.txt", "r", stdin);//  freopen("out.txt","w",stdout);#endif    ios_base::sync_with_stdio(0);    while(scanf("%d%d%d", &n, &w, &q) == 3) {        if(n > q) n = q;        build(root);        while(q--) {            int x; scanf("%d", &x);            if(maxv[1] < x) puts("-1");            else printf("%d\n", query(x, root));        }    }    return 0;}


0 0
原创粉丝点击