N个房间,入住的人只能安排连续的房间
莫名其妙T了半天- -||query函数没写好~虽然我觉得我写得挺对的,就是不让过
#include"cstdio" #include"queue" #include"cmath" #include"stack" #include"iostream" #include"algorithm" #include"cstring" #include"queue" #include"map" #include"set" #include"vector" #define ll long long #define mems(a,b) memset(a,b,sizeof(a)) #define ls pos<<1 #define rs pos<<1|1 using namespace std; const int MAXN = 80500; const int MAXE = 200500; const int INF = 0x3f3f3f3f; struct Node{ int l,r; int len; int lazy; int maxz;///连续空 int p; ///最大连续空的起始位置 int lz,rz;///左连续 右连续 }node[MAXN<<2]; void debug(int pos){ cout<<node[pos].l<<' '<<node[pos].r<<endl; cout<<"maxz:"<<node[pos].maxz<<endl; cout<<"p:"<<node[pos].p<<endl; cout<<"lz:"<<node[pos].lz<<endl; cout<<"rz:"<<node[pos].rz<<endl; } void pushup(int pos){ if(node[ls].maxz==node[ls].len) node[pos].lz=node[ls].len+node[rs].lz; else node[pos].lz=node[ls].lz; if(node[rs].maxz==node[rs].len) node[pos].rz=node[rs].len+node[ls].rz; else node[pos].rz=node[rs].rz; node[pos].maxz=max(node[ls].maxz,node[rs].maxz); node[pos].p=node[ls].maxz>=node[rs].maxz?node[ls].p:node[rs].p; node[pos].maxz=max(node[pos].maxz,node[ls].rz+node[rs].lz); if(node[ls].rz+node[rs].lz>=node[pos].maxz) node[pos].p=min(node[pos].p,node[ls].r-node[ls].rz+1); } void pushdown(int pos){ int &t=node[pos].lazy; if(t!=-1){ node[ls].lazy=node[rs].lazy=t; if(!t){ node[ls].maxz=node[ls].lz=node[ls].rz=node[ls].len; node[ls].p=node[ls].l; node[rs].maxz=node[rs].lz=node[rs].rz=node[rs].len; node[rs].p=node[rs].l; } else{ node[ls].maxz=node[ls].lz=node[ls].rz=0; node[ls].p=node[ls].r+1;///不存在 node[rs].maxz=node[rs].lz=node[rs].rz=0; node[rs].p=node[rs].r+1; } t=-1; } } void build(int l,int r,int pos){ node[pos].l=l; node[pos].r=r; node[pos].lazy=-1; node[pos].len=node[pos].lz=node[pos].rz=node[pos].maxz=r-l+1; node[pos].p=l; if(l==r) return; int mid=(l+r)>>1; build(l,mid,ls); build(mid+1,r,rs); pushup(pos); } void update(int l,int r,int pos,int k){ if(l<=node[pos].l&&node[pos].r<=r){ node[pos].lazy=k; if(!k){ node[pos].maxz=node[pos].lz=node[pos].rz=node[pos].len; node[pos].p=node[pos].l; } else{ node[pos].maxz=node[pos].lz=node[pos].rz=0; node[pos].p=node[pos].r+1;///不存在 } return; } pushdown(pos); int mid=(node[pos].l+node[pos].r)>>1; if(l<=mid) update(l,r,ls,k); if(r>mid) update(l,r,rs,k); pushup(pos); } int query(int k,int pos){ if(node[pos].l==node[pos].r) return node[pos].l; pushdown(pos); int mid=(node[pos].l+node[pos].r)>>1; if(node[ls].maxz>=k) return query(k,ls); ///房间尽量靠左 else if(node[ls].rz+node[rs].lz>=k) return node[ls].r-node[ls].rz+1;///房间尽量靠左 else return query(k,rs); } /*int query(int k,int pos){ if(node[pos].maxz<k) return INF; if(node[pos].l==node[pos].r) return node[pos].l; pushdown(pos); int a=query(k,ls); int b=query(k,rs); int c=node[pos].p; if(node[ls].rz+node[rs].lz>=k) c=min(c,node[ls].r-node[ls].rz+1); return min(c,min(a,b)); }*/ int main(){ //freopen("in.txt","r",stdin); //freopen("pending.txt","w",stdout); int n,m; while(~scanf("%d%d",&n,&m)){ build(1,n,1); for(int i=0;i<m;i++){ int op,a,b; scanf("%d",&op); if(op==1){ scanf("%d",&a); if(node[1].maxz<a) printf("0 "); else{ b=query(a,1); printf("%d ",b); update(b,b+a-1,1,1); } } else{ scanf("%d%d",&a,&b); update(a,a+b-1,1,0); } } } return 0; }