pku 3667 hotel

来源:互联网 发布:腾讯视频pad提示无网络 编辑:程序博客网 时间:2024/06/10 03:28

感觉题目不难啊,就是处理有点烦而已。水过了。pku30题留个纪念。

#include<stdio.h>#include<iostream>using namespace std;const int OTHER = 0;const int FULL = 1;const int EMPTY = -1;const int QUERRY = 1;const int LEAVE = 2;const int MAX_N = 50050;const int MAX_T = MAX_N*2;const int root = 1;struct node{int L,R;int Lid,Rid;int value;int Lvalue,Rvalue;int tag;};struct node T[MAX_T];int N,M;int times;struct node Tmaking(int a,int b,int c,int d,int e,int f,int g,int h){struct node tmp ;tmp.L=a;tmp.R=b;tmp.Lid=c;tmp.Rid=d;tmp.value=e;tmp.Lvalue=f;tmp.Rvalue=g;tmp.tag=h;return tmp;}void Build(int l,int r){if (l==r) {T[++times]=Tmaking(l,r,-1,-1,1,1,1,OTHER);return ;}int mid=(l+r)/2;int now=++times;int lid=times+1;Build(l,mid);int rid=times+1;Build(mid+1,r);T[now]=Tmaking(l,r,lid,rid,r-l+1,r-l+1,r-l+1,OTHER);}void init(){scanf("%d %d",&N,&M);Build(1,N);}void lazy_tag(int t){if (T[t].tag!=OTHER){int l=T[t].L;int r=T[t].R;int lid=T[t].Lid;int rid=T[t].Rid;int mid=(l+r)/2; T[lid].tag=T[rid].tag=T[t].tag;T[lid].value=T[lid].Lvalue=T[lid].Rvalue=(T[t].tag==FULL?0:mid-l+1);T[rid].value=T[rid].Lvalue=T[rid].Rvalue=(T[t].tag==FULL?0:r-mid);T[t].tag=OTHER;}}void change(int t,int s,int e,int tagf){int l=T[t].L;int r=T[t].R;int lid=T[t].Lid;int rid=T[t].Rid;int mid=(l+r)/2; int atag= (tagf==FULL?0:r-l+1);if (s<=l&&e>=r) {T[t]=Tmaking(l,r,lid,rid,atag,atag,atag,tagf);return ;}lazy_tag(t);if (e<=mid) change(lid,s,e,tagf);else if (s>mid) change(rid,s,e,tagf);else change(lid,s,mid,tagf),change(rid,mid+1,e,tagf);int value = max(T[lid].value,T[rid].value);value=max(value,T[lid].Rvalue+T[rid].Lvalue);int lvalue = T[lid].Lvalue;if (lvalue==mid-l+1) lvalue+=T[rid].Lvalue;int rvalue = T[rid].Rvalue;if (rvalue==r-mid) rvalue+=T[lid].Rvalue;T[t]=Tmaking(l,r,lid,rid,value,lvalue,rvalue,OTHER);}int Querry(int t,int room){if (T[t].value<room) return 0;int l=T[t].L;int r=T[t].R;int lid=T[t].Lid;int rid=T[t].Rid;int mid=(l+r)/2;lazy_tag(t);int pos;pos=Querry(lid,room);if (pos) return pos;if (T[lid].Rvalue+T[rid].Lvalue>=room) pos=mid-T[lid].Rvalue+1;if (pos) return pos;pos=Querry(rid,room);if (pos) return pos;return 0;}void work_put(){int op,a,b,i;int pos;for (i=1;i<=M;i++){scanf("%d",&op);if (op==QUERRY){scanf("%d",&a);pos=Querry(root,a);printf("%d\n",pos);if (pos) change(root,pos,pos+a-1,FULL);}if (op==LEAVE){scanf("%d %d",&a,&b);change(root,a,a+b-1,EMPTY);}}}int main(){init();work_put();return 0;}