POJ Hotel 线段树 区间合并

来源:互联网 发布:java api手机版 编辑:程序博客网 时间:2024/06/11 00:14

线段树模板题

#include <cstdio>#include <iostream>#include <algorithm>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1using namespace std;const int MAX = 50000 + 5;int lsum[MAX << 2], rsum[MAX << 2], msum[MAX << 2];int cover[MAX << 2];void pushUp(int rt, int m){    lsum[rt] = lsum[rt << 1];    rsum[rt] = rsum[rt << 1 | 1];    if(lsum[rt] == m - (m >> 1))        lsum[rt] += lsum[rt << 1 | 1];    if(rsum[rt] == (m >> 1))        rsum[rt] += rsum[rt << 1];    msum[rt] = max(rsum[rt << 1] + lsum[rt << 1 | 1], max(msum[rt << 1], msum[rt << 1 | 1]));}void pushDown(int rt, int m){    if(cover[rt] != -1){        cover[rt << 1] = cover[rt << 1 | 1] = cover[rt];        msum[rt << 1] = rsum[rt << 1] = lsum[rt << 1] = cover[rt] ? 0 : m - (m >> 1);        msum[rt << 1 | 1] = rsum[rt << 1 | 1] = lsum[rt << 1 | 1] = cover[rt] ? 0 : (m >> 1);        cover[rt] = -1;    }}void build(int l, int r, int rt){    msum[rt] = lsum[rt] = rsum[rt] = r - l + 1;    cover[rt] = -1;    if(r == l)        return;    int m = (l + r) >> 1;    build(lson);    build(rson);}void update(int L, int R, int c, int l, int r, int rt){    if(L <= l && r <= R){        msum[rt] = lsum[rt] = rsum[rt] = c ? 0 : r - l + 1;        cover[rt] = c;        return;    }    pushDown(rt, r - l + 1);    int m = (r + l) >> 1;    if(L <= m)        update(L, R, c, lson);    if(m < R)        update(L, R, c, rson);    pushUp(rt, r - l + 1);}int query(int w, int l, int r, int rt){    if(l == r)        return l;    pushDown(rt, r - l + 1);    int m = (l + r) >> 1;    if(msum[rt << 1] >= w)        return query(w, lson);    else if(rsum[rt << 1] + lsum[rt << 1 | 1] >= w)        return m - rsum[rt << 1] + 1;    return query(w, rson);}int main(){    int n, m, ca, a, b, w;    while(~scanf("%d%d", &n, &m)) {        build(1, n, 1);        while(m--) {            scanf("%d", &ca);            if(ca == 1){                scanf("%d", &w);                if(msum[1] < w)                    printf("0\n");                else {                    int l = query(w, 1, n, 1);                    printf("%d\n", l);                    update(l, l + w - 1, 1, 1, n, 1);                }            }            else {                scanf("%d%d", &a, &b);                update(a, a + b - 1, 0, 1, n, 1);            }        }    }    return 0;}


0 0
原创粉丝点击