1 条题解
-
1
C++ :
#include<cstdio> #define kl k<<1 #define kr k<<1|1 const int N=50001; int f[N<<2]; struct node{int sr,sl,ms;}t[N<<2]; int max(int a,int b){if(a>b)return a;return b;} void build(int L,int R,int k){ t[k].sl=t[k].sr=t[k].ms=R-L+1; if(L==R)return; int mid=(L+R)>>1; build(L,mid,kl); build(mid+1,R,kr); } void pushdown(int k,int L,int R){ if(f[k]!=0){ f[kl]=f[kr]=f[k]; t[kl].sl=t[kl].sr=t[kl].ms=f[k]==1?R-L+1:0; t[kr].sl=t[kr].sr=t[kl].ms=f[k]==1?R-L+1:0; f[k]=0; } } void pushup(int k,int d){ t[k].sl=t[kl].sl; t[k].sr=t[kr].sr; if(t[kl].sl==d-(d>>1))t[k].sl+=t[kr].sl; if(t[kr].sr==d>>1)t[k].sr+=t[kl].sr; t[k].ms=max(max(t[kl].ms,t[kr].ms),t[kl].sr+t[kr].sl); } int query(int L,int R,int x,int k){ if(L==R)return L; pushdown(k,L,R); int mid=(L+R)>>1; if(t[kl].ms>=x)return query(L,mid,x,kl); else if(t[kl].sr+t[kr].sl>=x)return mid-t[kl].sr+1; return query(mid+1,R,x,kr); } void update(int L,int R,int s,int e,int c,int k){ if(s<=L&&e>=R){ t[k].sl=t[k].sr=t[k].ms=c==1?R-L+1:0; f[k]=c; return; } pushdown(k,L,R); int mid=(L+R)>>1; if(s<=mid)update(L,mid,s,e,c,kl); if(e>mid)update(mid+1,R,s,e,c,kr); pushup(k,R-L+1); } int main(){ int i,n,m,a,b,c; scanf("%d%d",&n,&m); build(1,n,1); for(i=0;i<m;i++){ scanf("%d",&c); if(c==1){ scanf("%d",&a); if(t[1].ms<a)printf("0\n"); else printf("%d\n",b=query(1,n,b,1)),update(1,n,b,b+a-1,-1,1); } else scanf("%d%d",&a,&b),update(1,n,a,a+b-1,1,1); } return 0; }
- 1
信息
- ID
- 1611
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者