hdu-2871

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=55555;
using namespace std;
int lsum[maxn<<2],rsum[maxn<<2],sum[maxn<<2];
int cover[maxn<<2],st[maxn],ed[maxn];
set<int>s;
set<int>::iterator itr;
void pushUp(int rt,int m)
{
    rsum[rt]=rsum[rt<<1|1];
    lsum[rt]=lsum[rt<<1];
    if(lsum[rt]==(m-(m>>1)))
        lsum[rt]=lsum[rt]+lsum[rt<<1|1];
    if(rsum[rt]==m>>1)
        rsum[rt]=rsum[rt]+rsum[rt<<1];
    sum[rt]=max(rsum[rt<<1]+lsum[rt<<1|1],max(sum[rt<<1],sum[rt<<1|1]));
}
void pushdown(int rt,int m)
{
    if(cover[rt]!=0){
        cover[rt<<1]=cover[rt<<1|1]=cover[rt];
        sum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=cover[rt]!=-1?0:m-(m>>1);
        sum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=cover[rt]!=-1?0:m>>1;
        cover[rt]=0;
    }
}
void build(int l,int r,int rt)
{
    sum[rt]=lsum[rt]=rsum[rt]=r-l+1;
    cover[rt]=-1;
    if(l==r) return ;
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    pushUp(rt,r-l+1);
}
int query(int d,int l,int r,int rt)
{
    if(l==r) return l;
    pushdown(rt,r-l+1);
    int m=(l+r)>>1;
    if(sum[rt<<1]>=d) return query(d,lson);
    else if(rsum[rt<<1]+lsum[rt<<1|1]>=d) return m-rsum[rt<<1]+1;
    return query(d,rson);
}
void update(int d,int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R){
        sum[rt]=lsum[rt]=rsum[rt]=d>0?0:r-l+1;
        cover[rt]=d;
        return;
    }
    int m=(l+r)>>1;
    pushdown(rt,r-l+1);
    if(L<=m) update(d,L,R,lson);
    if(R>m) update(d,L,R,rson);
    pushUp(rt,r-l+1);
}
int getID(int d,int l,int r,int rt)
{
    if(cover[rt]) return cover[rt];
    int m=(l+r)>>1;
    if(d<=m) return getID(d,lson);
    else return getID(d,rson);
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        s.clear();
        build(1,n,1);
        for(int i=1;i<=m;i++){
            char str[10];
            int d;
            scanf("%s",str);
            if(str[0]=='N'){
                scanf("%d",&d);
                if(d>sum[1])
                    printf("Reject New\n");
                else{
                    int a=query(d,1,n,1);
                    st[i]=a;ed[i]=a+d-1;
                    s.insert(a);
                    update(i,a,a+d-1,1,n,1);
                    printf("New at %d\n",a);
                }
            }
            if(str[0]=='F')
            {
                scanf("%d",&d);
                int state=getID(d,1,n,1);
                if(state==-1) printf("Reject Free\n");
                else
                {
                    update(-1,st[state],ed[state],1,n,1);
                    s.erase(st[state]);
                    printf("Free from %d to %d\n",st[state],ed[state]);
                }
            }
            if(str[0]=='G'){
                scanf("%d",&d);
                int num=0;
                for(itr=s.begin();itr!=s.end();itr++){
                    num++;
                    if(num==d){
                        printf("Get at %d\n",*itr);
                        break;
                    }
                }
                if(num<d) printf("Reject Get\n");
            }
            if(str[0]=='R') {
                cover[1]=-1;
                sum[1]=lsum[1]=rsum[1]=n;
                s.clear();
                printf("Reset Now\n");
            }
        }
        printf("\n");
    }
    return 0;
}
View Code

 

View Code

 

posted @ 2014-11-17 14:57  JarvisLau  阅读(182)  评论(0编辑  收藏  举报