POJ 3667
2013-12-02 18:32
387 查看
题意: 一个旅馆有N个连续的空房间。。。
接下来一些操作
进来的旅客都需要有一些连续的空房间
如果有则输出首个房间的位置。如果没有就输出0.
或者是在某个位置开始空出连续的一些房间。(房间原来就可以是空的)
思路:
首先建立线段树。。
每个区间要保存该区间内从左数的空房间数,lk,从右数的空房间数rk和最大空房间数mk.
每次更新改区间的时候就是分情况来更新lk,rk,mk这三个数据。
剩下的没有什么需要注意的了。。。只要注意查找区间时的顺序应该是从左子树,左子树的rk+右子树的lk,右子树就可以了。
贴上代码。
接下来一些操作
进来的旅客都需要有一些连续的空房间
如果有则输出首个房间的位置。如果没有就输出0.
或者是在某个位置开始空出连续的一些房间。(房间原来就可以是空的)
思路:
首先建立线段树。。
每个区间要保存该区间内从左数的空房间数,lk,从右数的空房间数rk和最大空房间数mk.
每次更新改区间的时候就是分情况来更新lk,rk,mk这三个数据。
剩下的没有什么需要注意的了。。。只要注意查找区间时的顺序应该是从左子树,左子树的rk+右子树的lk,右子树就可以了。
贴上代码。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; int m; struct tree{ int left; int right; int lk; int mk; int rk; int flag; int lazy; }tree[800000]; void inset(int inst,int le,int ri) { tree[inst].left=le; tree[inst].right=ri; tree[inst].lk=(ri-le+1); tree[inst].rk=(ri-le+1); tree[inst].mk=(ri-le+1); tree[inst].flag=0; tree[inst].lazy=2; if(le==ri) return ; int mid=(le+ri)>>1; inset(2*inst,le,mid); inset(2*inst+1,mid+1,ri); } void cd(int inst) { //cout<<"cd"<<endl; if(tree[inst].lazy==0) { //cout<<"cd1 "<<inst<<endl; tree[2*inst].lk=(tree[2*inst].right-tree[2*inst].left+1); tree[2*inst].rk=(tree[2*inst].right-tree[2*inst].left+1); tree[2*inst].mk=(tree[2*inst].right-tree[2*inst].left+1); tree[2*inst+1].lk=(tree[2*inst+1].right-tree[2*inst+1].left+1); tree[2*inst+1].rk=(tree[2*inst+1].right-tree[2*inst+1].left+1); tree[2*inst+1].mk=(tree[2*inst+1].right-tree[2*inst+1].left+1); tree[inst].flag=1; tree[2*inst].lazy=0;tree[2*inst+1].lazy=0; tree[inst].lazy=2; } else if(tree[inst].lazy==1) { //cout<<"cd2 "<<inst<<endl; tree[2*inst].lk=0; tree[2*inst].mk=0; tree[2*inst].rk=0; tree[2*inst+1].lk=0; tree[2*inst+1].mk=0; tree[2*inst+1].rk=0; tree[inst].flag=1; tree[2*inst].lazy=1;tree[2*inst+1].lazy=1; tree[inst].lazy=2; } } void add(int inst,int le,int ri) { if(tree[inst].left==le&&tree[inst].right==ri) { tree[inst].lk=(ri-le+1); tree[inst].mk=(ri-le+1); tree[inst].rk=(ri-le+1); tree[inst].lazy=0; tree[inst].flag=0; //cout<<tree[inst].mk<<endl; return ; } cd(inst); tree[inst].flag=1; if(tree[inst].left==tree[inst].right) return ; int mid=(tree[inst].left+tree[inst].right)>>1; if(ri<=mid) add(2*inst,le,ri); else if(le>mid) add(2*inst+1,le,ri); else { add(2*inst,le,mid); add(2*inst+1,mid+1,ri); } } void add1(int inst,int le,int ri) { //cout<<inst<<" "<<le<<" "<<ri<<endl; if(tree[inst].left==le&&tree[inst].right==ri) { //cout<<tree[inst].left<<" "<<tree[inst].right<<endl; tree[inst].lk=0; tree[inst].mk=0; tree[inst].rk=0; tree[inst].lazy=1; tree[inst].flag=0; return ; } cd(inst); tree[inst].flag=1; if(tree[inst].left==tree[inst].right) return ; int mid=(tree[inst].left+tree[inst].right)>>1; if(ri<=mid) add1(2*inst,le,ri); else if(le>mid) add1(2*inst+1,le,ri); else { add1(2*inst,le,mid); add1(2*inst+1,mid+1,ri); } } void flag(int inst) { //cout<<"flag"<<endl; if(tree[inst].lazy!=2) cd(inst); //if(inst==3) cout<<tree[2*inst].mk<<" "<<tree[2*inst+1].mk<<" 1"<<endl; if(tree[2*inst].flag!=0) flag(2*inst); if(tree[2*inst+1].flag!=0) flag(2*inst+1); tree[inst].flag=0; tree[inst].lazy=2; tree[inst].lk=tree[2*inst].lk; tree[inst].rk=tree[2*inst+1].rk; tree[inst].mk=max(tree[2*inst].mk,max(tree[2*inst+1].mk,tree[2*inst].rk+tree[2*inst+1].lk)); //if(inst==3) cout<<tree[inst].mk<<" 2"<<endl; if(tree[2*inst].lk==(tree[2*inst].right-tree[2*inst].left+1)) tree[inst].lk=tree[2*inst].lk+tree[2*inst+1].lk; if(tree[2*inst+1].rk==(tree[2*inst+1].right-tree[2*inst+1].left+1)) tree[inst].rk=tree[2*inst].rk+tree[2*inst+1].rk; //cout<<inst<<" "<<tree[inst].lk<<" "<<tree[2*inst].lk<<" lk"<<endl; //cout<<inst<<" "<<tree[inst].rk<<" "<<tree[2*inst+1].rk<<" rk"<<endl; //cout<<inst<<" "<<tree[inst].mk<<" "<<tree[2*inst].mk<<" mk"<<endl; } void query(int inst,int k) { //cout<<tree[3].mk<<" 1"<<endl; if(tree[inst].flag!=0) flag(inst); //cout<<tree[3].mk<<" 2"<<endl; //cout<<inst<<" "<<tree[inst].mk<<" "<<tree[2*inst].mk<<" "<<tree[2*inst+1].mk<<endl; if(tree[inst].right==tree[inst].left) { if(k==1) { if(tree[inst].mk==1) { m=tree[inst].left; //cout<<"add1"<<tree[inst].left<<" "<<tree[inst].right<<endl; add1(inst,tree[inst].left,tree[inst].right); } else m=0; } else m=0; //cout<<m<<endl; return ; } cd(inst); if(tree[inst].mk>=k) { tree[inst].flag=1; tree[inst].lazy=2; if(tree[2*inst].mk>=k) { //cout<<m<<endl; query(2*inst,k); } else if(tree[2*inst].rk+tree[2*inst+1].lk>=k&&tree[2*inst].rk!=0) { m=tree[2*inst].right-tree[2*inst].rk+1; int t=tree[2*inst+1].left+k-tree[2*inst].rk-1; add1(inst,tree[2*inst].right-tree[2*inst].rk+1,tree[2*inst].right); add1(inst,tree[2*inst+1].left,t); //cout<<inst<<endl; } else if(tree[2*inst+1].mk>=k) { //cout<<inst<<endl; query(2*inst+1,k); } } else { //cout<<"###"<<endl; m=0; return ; } } int main() { int n,m1; while(scanf("%d%d",&n,&m1)!=EOF) { inset(1,1,n); while(m1--) { int x,a,b; scanf("%d",&x); if(x==1) { m=0; scanf("%d",&a); //cout<<a<<endl; query(1,a); printf("%d\n",m); // cout<<"!!! "<<tree[3].mk<<endl; } else { scanf("%d%d",&a,&b); add(1,a,a+b-1); } } } }
相关文章推荐
- python 关于配置文件,日志,传参总结
- [JS]1.Hello Word
- 读一本跟技术无关的书籍
- 笑话
- python switch函数
- Django全局context处理器例子
- 第十四周上机实践项目——字符数组排序
- Unix编程艺术——Unix哲学
- 前缀式与后缀式
- Delphi 调用外部程序并等待其运行结束
- python lambda函数
- pthread_getspecific()和pthread_setspecific()的使用方法
- ios应用程序生命周期
- 真正的冒泡排序
- MySQL wait_timeout参数设置与网上常见错误小纠
- [jQuery]empty()和remove()的区别
- -D_REENTRANT 宏作用
- [jQuery]empty()和remove()的区别
- Dijkstra算法
- 桌面截图