POJ 3667 :线段树

N个房间,入住的人只能安排连续的房间

莫名其妙T了半天- -||query函数没写好~虽然我觉得我写得挺对的,就是不让过

#include"cstdio"
#include"queue"
#include"cmath"
#include"stack"
#include"iostream"
#include"algorithm"
#include"cstring"
#include"queue"
#include"map"
#include"set"
#include"vector"
#define ll long long
#define mems(a,b) memset(a,b,sizeof(a))
#define ls pos<<1
#define rs pos<<1|1

using namespace std;
const int MAXN = 80500;
const int MAXE = 200500;
const int INF = 0x3f3f3f3f;

struct Node{
    int l,r;
    int len;
    int lazy;
    int maxz;///连续空
    int p;  ///最大连续空的起始位置
    int lz,rz;///左连续 右连续
}node[MAXN<<2];

void debug(int pos){
    cout<<node[pos].l<<'\t'<<node[pos].r<<endl;
    cout<<"maxz:"<<node[pos].maxz<<endl;
    cout<<"p:"<<node[pos].p<<endl;
    cout<<"lz:"<<node[pos].lz<<endl;
    cout<<"rz:"<<node[pos].rz<<endl;
}

void pushup(int pos){
    if(node[ls].maxz==node[ls].len) node[pos].lz=node[ls].len+node[rs].lz;
    else node[pos].lz=node[ls].lz;
    if(node[rs].maxz==node[rs].len) node[pos].rz=node[rs].len+node[ls].rz;
    else node[pos].rz=node[rs].rz;

    node[pos].maxz=max(node[ls].maxz,node[rs].maxz);
    node[pos].p=node[ls].maxz>=node[rs].maxz?node[ls].p:node[rs].p;
    node[pos].maxz=max(node[pos].maxz,node[ls].rz+node[rs].lz);
    if(node[ls].rz+node[rs].lz>=node[pos].maxz) node[pos].p=min(node[pos].p,node[ls].r-node[ls].rz+1);
}

void pushdown(int pos){
    int &t=node[pos].lazy;
    if(t!=-1){
        node[ls].lazy=node[rs].lazy=t;
        if(!t){
            node[ls].maxz=node[ls].lz=node[ls].rz=node[ls].len;
            node[ls].p=node[ls].l;
            node[rs].maxz=node[rs].lz=node[rs].rz=node[rs].len;
            node[rs].p=node[rs].l;
        }
        else{
            node[ls].maxz=node[ls].lz=node[ls].rz=0;
            node[ls].p=node[ls].r+1;///不存在
            node[rs].maxz=node[rs].lz=node[rs].rz=0;
            node[rs].p=node[rs].r+1;
        }
        t=-1;
    }
}

void build(int l,int r,int pos){
    node[pos].l=l;
    node[pos].r=r;
    node[pos].lazy=-1;
    node[pos].len=node[pos].lz=node[pos].rz=node[pos].maxz=r-l+1;
    node[pos].p=l;
    if(l==r) return;
    int mid=(l+r)>>1;
    build(l,mid,ls);
    build(mid+1,r,rs);
    pushup(pos);
}

void update(int l,int r,int pos,int k){
    if(l<=node[pos].l&&node[pos].r<=r){
        node[pos].lazy=k;
        if(!k){
            node[pos].maxz=node[pos].lz=node[pos].rz=node[pos].len;
            node[pos].p=node[pos].l;
        }
        else{
            node[pos].maxz=node[pos].lz=node[pos].rz=0;
            node[pos].p=node[pos].r+1;///不存在
        }
        return;
    }
    pushdown(pos);
    int mid=(node[pos].l+node[pos].r)>>1;
    if(l<=mid) update(l,r,ls,k);
    if(r>mid) update(l,r,rs,k);
    pushup(pos);
}

int query(int k,int pos){
    if(node[pos].l==node[pos].r) return node[pos].l;
    pushdown(pos);
    int mid=(node[pos].l+node[pos].r)>>1;
    if(node[ls].maxz>=k) return query(k,ls);    ///房间尽量靠左
    else if(node[ls].rz+node[rs].lz>=k) return node[ls].r-node[ls].rz+1;///房间尽量靠左
    else return query(k,rs);
}
/*int query(int k,int pos){
    if(node[pos].maxz<k) return INF;
    if(node[pos].l==node[pos].r) return node[pos].l;
    pushdown(pos);
    int a=query(k,ls);
    int b=query(k,rs);
    int c=node[pos].p;
    if(node[ls].rz+node[rs].lz>=k) c=min(c,node[ls].r-node[ls].rz+1);
    return min(c,min(a,b));
}*/
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("pending.txt","w",stdout);
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        build(1,n,1);
        for(int i=0;i<m;i++){
            int op,a,b;
            scanf("%d",&op);
            if(op==1){
                scanf("%d",&a);
                if(node[1].maxz<a) printf("0\n");
                else{
                    b=query(a,1);
                    printf("%d\n",b);
                    update(b,b+a-1,1,1);
                }
            }
            else{
                scanf("%d%d",&a,&b);
                update(a,a+b-1,1,0);
            }
        }
    }
    return 0;
}

 

posted @ 2016-01-18 19:56  Septher  阅读(150)  评论(0编辑  收藏  举报