标签:
1 5 6 DS 3 NS 2 NS 4 STUDY!! 1 5 DS 4 NS 2
Case 1: 1,let‘s fly 4,don‘t put my gezi wait for me I am the hope of chinese chengxuyuan!! 1,let‘s fly 1,don‘t put my gezi
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) typedef long long LL; typedef pair<int,int>pil; const int maxn=100000+10; int sum[2][maxn<<2],col[2][maxn<<2];//sum[2][i]屌丝和女神,col=1表示有空位 int lsum[2][maxn<<2],rsum[2][maxn<<2]; int t,n,m; void pushup(int p,int rs,int s) { lsum[p][rs]=lsum[p][rs<<1]; rsum[p][rs]=rsum[p][rs<<1|1]; if(lsum[p][rs<<1]==(s-(s>>1))) lsum[p][rs]+=lsum[p][rs<<1|1]; if(rsum[p][rs<<1|1]==(s>>1)) rsum[p][rs]+=rsum[p][rs<<1]; sum[p][rs]=max(max(sum[p][rs<<1],sum[p][rs<<1|1]),rsum[p][rs<<1]+lsum[p][rs<<1|1]); } void pushdown(int p,int rs,int s) { if(col[p][rs]!=-1) { if(col[p][rs]==1) { sum[p][rs<<1]=lsum[p][rs<<1]=rsum[p][rs<<1]=(s-(s>>1)); sum[p][rs<<1|1]=lsum[p][rs<<1|1]=rsum[p][rs<<1|1]=(s>>1); col[p][rs<<1]=col[p][rs<<1|1]=1; col[p][rs]=-1; } else { sum[p][rs<<1]=lsum[p][rs<<1]=rsum[p][rs<<1]=0; sum[p][rs<<1|1]=lsum[p][rs<<1|1]=rsum[p][rs<<1|1]=0; col[p][rs<<1]=col[p][rs<<1|1]=0; col[p][rs]=-1; } } } void build(int p,int l,int r,int rs) { col[p][rs]=-1; sum[p][rs]=lsum[p][rs]=rsum[p][rs]=r-l+1; if(l==r) return ; int mid=(l+r)>>1; build(p,l,mid,rs<<1); build(p,mid+1,r,rs<<1|1); } void update(int p,int x,int y,int c,int l,int r,int rs) { if(l>=x&&r<=y) { col[p][rs]=c; if(c) sum[p][rs]=lsum[p][rs]=rsum[p][rs]=r-l+1; else sum[p][rs]=lsum[p][rs]=rsum[p][rs]=0; return ; } pushdown(p,rs,r-l+1); int mid=(l+r)>>1; if(x<=mid) update(p,x,y,c,l,mid,rs<<1); if(y>mid) update(p,x,y,c,mid+1,r,rs<<1|1); pushup(p,rs,r-l+1); } int query(int p,int x,int l,int r,int rs) { if(l==r) return l; pushdown(p,rs,r-l+1); int mid=(l+r)>>1; if(sum[p][rs<<1]>=x) return query(p,x,l,mid,rs<<1); else if(rsum[p][rs<<1]+lsum[p][rs<<1|1]>=x) return mid-rsum[p][rs<<1]+1; else return query(p,x,mid+1,r,rs<<1|1); pushup(p,rs,r-l+1); } int main() { int x,l,r,ans; int cas=1; char str[15]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); build(0,1,n,1); build(1,1,n,1); printf("Case %d:\n",cas++); while(m--) { scanf("%s",str); if(str[0]=='D') { scanf("%d",&x); if(sum[0][1]<x) puts("fly with yourself"); else { ans=query(0,x,1,n,1); printf("%d,let's fly\n",ans); update(0,ans,ans+x-1,0,1,n,1); } } else if(str[0]=='N') { scanf("%d",&x); if(sum[0][1]>=x) { ans=query(0,x,1,n,1); printf("%d,don't put my gezi\n",ans); update(0,ans,ans+x-1,0,1,n,1); update(1,ans,ans+x-1,0,1,n,1); } else { if(sum[1][1]>=x) { ans=query(1,x,1,n,1); printf("%d,don't put my gezi\n",ans); update(0,ans,ans+x-1,0,1,n,1); update(1,ans,ans+x-1,0,1,n,1); } else puts("wait for me"); } } else { scanf("%d%d",&l,&r); puts("I am the hope of chinese chengxuyuan!!"); update(0,l,r,1,1,n,1); update(1,l,r,1,1,n,1); } } } return 0; }
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/42836523