这个题和hotel很像,其中对vector的使用很巧妙,不过还有一点没弄懂,就是那个二分的写法 /* * File: main.cpp * Author: Mi * * Created on 2011年3月15日, 下午2:18 */ #include <cstdlib> #include <stdio.h> #include <string.h> #include <vector> #define N 50005 #define max(a,b) (a)>(b)?(a):(b) using namespace std; /* * */ struct node { int st,ed; }temp; vector <node> p; struct tree { int l,r,lv,rv,cv,state; }T[N*3]; void init(int root) { T[root].lv=T[root].rv=T[root].cv=T[root].state==0?T[root].r-T[root].l+1:0; } void build(int l,int r,int root) { T[root].l=l,T[root].r=r; T[root].state=0; if(l==r) { T[root].lv=T[root].rv=T[root].cv=1; return ; } int mid=(l+r)>>1; build(l,mid,root<<1); build(mid+1,r,root<<1|1); T[root].lv=T[root].rv=T[root].cv=r-l+1; } void modify(int l,int r,int root,int d) { if(l<=T[root].l&&r>=T[root].r) { T[root].state=d; init(root); return ; } if(T[root].state!=-1) { T[root<<1].state=T[root<<1|1].state=T[root].state; init(root<<1); init(root<<1|1); T[root].state=-1; } int mid=(T[root].l+T[root].r)>>1; if(r<=mid) modify(l,r,root<<1,d); else if(l>=mid+1) modify(l,r,root<<1|1,d); else { modify(l,mid,root<<1,d); modify(mid+1,r,root<<1|1,d); } T[root].lv=T[root<<1].lv; T[root].rv=T[root<<1|1].rv; T[root].cv=max(max(T[root<<1].cv,T[root<<1|1].cv),T[root<<1].rv+T[root<<1|1].lv); if(T[root].lv==T[root<<1].r-T[root<<1].l+1) T[root].lv+=T[root<<1|1].lv; if(T[root].rv==T[root<<1|1].r-T[root<<1|1].l+1) T[root].rv+=T[root<<1].rv; } int query(int x,int root) { if(T[root].l==T[root].r) return T[root].l; if(T[root].state!=-1) { T[root<<1].state=T[root<<1|1].state=T[root].state; init(root<<1); init(root<<1|1); T[root].state=-1; } if(T[root<<1].cv>=x) return query(x,root<<1); else if(T[root<<1].rv+T[root<<1|1].lv>=x) return T[root<<1].r-T[root<<1].rv+1; else if(T[root<<1|1].cv>=x) return query(x,root<<1|1); return 0; } int binsearch(int x) { int l=0,r=p.size()-1,mid; while(l<=r) { mid=(l+r)>>1; if(p[mid].st<=x) l=mid+1; if(p[mid].st>x) r=mid-1; } return l; } int main(int argc, char** argv) { int n,q,num; while(scanf("%d%d",&n,&q)!=EOF) { p.clear(); char str[20]; int x,b; build(1,n,1); while(q--) { scanf("%s",str); if(str[0]=='N') { scanf("%d",&x); b=query(x,1); if(b) { printf("%s at %d/n",str,b); num=binsearch(b); //printf("b=%d num=%d/n",b,num); temp.st=b,temp.ed=x+b-1; p.insert(p.begin()+num,temp); modify(b,x+b-1,1,1); } else puts("Reject New"); } else if(str[0]=='F') { scanf("%d",&x); num=binsearch(x)-1; if(num<=-1||p[num].ed<x) puts("Reject Free"); else { printf("%s from %d to %d/n",str,p[num].st,p[num].ed); modify(p[num].st,p[num].ed,1,0); p.erase(p.begin()+num); } } else if(str[0]=='G') { scanf("%d",&x); if(p.size()<x) puts("Reject Get"); else { x--; printf("%s at %d/n",str,p[x].st); } } else { T[1].state=0; init(1); p.clear(); puts("Reset Now"); } } puts(""); } return 0; }