POJ - 3667 Hotel(线段树)

来源:互联网 发布:oracle数据库安装成功 编辑:程序博客网 时间:2024/05/21 11:01

区间合并问题。


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int maxn=55555;int msum[maxn<<2], lsum[maxn<<2], rsum[maxn<<2], cov[maxn<<2];void build(int l, int r, int rt){    cov[rt]=-1;    msum[rt]=lsum[rt]=rsum[rt]=r-l+1;    if(l==r)return ;    int mid=(l+r)>>1;    build(lson);    build(rson);}void pushup(int rt, int m){    lsum[rt]=lsum[rt<<1];    rsum[rt]=rsum[rt<<1|1];    if(lsum[rt<<1]==m-(m>>1))lsum[rt]+=lsum[rt<<1|1];    if(rsum[rt<<1|1]==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(cov[rt]==-1)return ;    cov[rt<<1]=cov[rt<<1|1]=cov[rt];    msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1] = cov[rt] ? 0 : m-(m>>1);    msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1] = cov[rt] ? 0 : m>>1;    cov[rt]=-1;}void update(int L, int R, int v, int l, int r, int rt){    if(L<=l && R>=r)    {        msum[rt]=lsum[rt]=rsum[rt] = v ? 0 : r-l+1;        cov[rt]=v;        return ;    }    int mid=(l+r)>>1;    pushdown(rt, r-l+1);    if(L<=mid)update(L, R, v, lson);    if(R>mid)update(L, R, v, rson);    pushup(rt, r-l+1);}int query(int w, int l, int r, int rt){    if(l==r)return l;    int mid=(l+r)>>1;    pushdown(rt, r-l+1);    if(msum[rt<<1]>=w)return query(w, lson);    if(rsum[rt<<1]+lsum[rt<<1|1]>=w)return mid-rsum[rt<<1]+1;    return query(w, rson);}int main(){    int n, m, op, a, b;    while(~scanf("%d%d", &n, &m))    {        build(1, n, 1);        while(m--)        {            scanf("%d", &op);            if(op==1)            {                int p;                scanf("%d", &a);                if(a>msum[1])                {                    puts("0");                    continue ;                }                printf("%d\n", p=query(a, 1, n, 1));                update(p, p+a-1, 1, 1, n, 1);            }            else            {                scanf("%d%d", &a, &b);                update(a, a+b-1, 0, 1, n, 1);            }        }    }    return 0;}


0 0
原创粉丝点击