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