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;}
- pku 3667 hotel
- PKU 3667 Hotel (线段树,区间合并,最长连续区间)
- 3667 Hotel
- poj 3667 Hotel
- poj 3667 Hotel
- poj 3667 Hotel
- poj 3667 hotel
- POJ 3667 Hotel
- POJ 3667 Hotel
- poj 3667 Hotel
- POJ 3667 Hotel
- POJ 3667 Hotel
- poj 3667 Hotel
- POJ-3667-Hotel
- Poj 3667 Hotel
- poj 3667 Hotel
- POJ 3667 Hotel
- POJ 3667 Hotel
- windows下详细图文教你搭建<进击的9秒>服务端【Firefly】
- 21世纪的文件系统:概述WindowsNT 5.0文件系统(NTFS)(二)
- [HDU 2451] Simple Addition Expression (组合数学 或 数位DPSimple Addition Expression)
- A. Letter
- UID-01-搜索相关
- pku 3667 hotel
- 解决:hibernate 生成MySQL表 无外键
- fatal signal 11 sigsegv
- CGContextSaveGState和CGContextRestoreGState UIGraphicsPushContext和UIGraphicsPopCo
- Android 仿大众点评团购购买条浮动效果
- LVS 三种工作模式的优缺点比较
- .net网站可以部署到linux系统
- 对于文件使用方式有以下几点说明:
- Hdu 3079 最短路径问题