POJ.3667 Hotel ( 线段树 )
来源:互联网 发布:吉郎pop美工族手册 编辑:程序博客网 时间:2024/05/21 12:46
POJ.3667 Hotel ( 线段树 )
题意分析
还需要好好理解一下
代码总览
#include <cstdio>#include <cstring>#include <algorithm>#define nmax 200010using namespace std;struct Tree{ int l,r; int lenmax; int llen,rlen; int lazy; int mid(){ return (l+r)>>1; } int interval_len(){ return (r-l+1); } void update_len(){ lenmax = llen = rlen = (lazy ?0:interval_len()); }};Tree tree[nmax<<2];int ans = 0;void PushUp(int rt){ int tmp = max(tree[rt<<1].lenmax,tree[rt<<1|1].lenmax); tree[rt].lenmax = max(tmp, (tree[rt<<1].rlen + tree[rt<<1|1].llen)); tree[rt].llen = tree[rt<<1].llen; tree[rt].rlen = tree[rt<<1|1].rlen; if(tree[rt<<1].lenmax == tree[rt<<1].interval_len()){ tree[rt].llen += tree[rt<<1|1].llen; } if(tree[rt<<1|1].lenmax == tree[rt<<1|1].interval_len()){ tree[rt].rlen += tree[rt<<1].rlen; }}void PushDown(int rt){ tree[rt<<1].lazy = tree[rt<<1|1].lazy = tree[rt].lazy; tree[rt].lazy = -1; tree[rt<<1].update_len(); tree[rt<<1|1].update_len();}void Build(int l, int r, int rt){ tree[rt].l = l; tree[rt].r = r; tree[rt].lenmax = tree[rt].llen = tree[rt].rlen = tree[rt].interval_len(); tree[rt].lazy = 0; if(l == r){ return; } Build(l,tree[rt].mid(),rt<<1); Build(tree[rt].mid()+1,r,rt<<1|1); //PushUp(rt);}void UpdateInterval(int val, int l, int r, int rt){ //if(tree[rt].l >r || tree[rt].r < l) return; if(tree[rt].l == l && tree[rt].r == r){ tree[rt].lazy = val; tree[rt].update_len(); return; } if(tree[rt].lazy != -1) PushDown(rt); if(l>tree[rt].mid()){ UpdateInterval(val,l,r,rt<<1|1); }else if(r <=tree[rt].mid()){ UpdateInterval(val,l,r,rt<<1); }else{ UpdateInterval(val,l,tree[rt].mid(),rt<<1); UpdateInterval(val,tree[rt].mid() +1,r,rt<<1|1); } PushUp(rt);}int Query(int val ,int rt){ if(tree[rt].l == tree[rt].r && val == 1) return tree[rt].l; if(tree[rt].lazy != -1) PushDown(rt); if(tree[rt<<1].lenmax >= val){ return Query(val,rt<<1); }else if(tree[rt<<1].rlen + tree[rt<<1|1].llen >= val){ return tree[rt<<1].r - tree[rt<<1].rlen + 1; }else if(tree[rt<<1|1].lenmax >= val){ return Query(val,rt<<1|1); }else{ return 0; }}int main(){ //freopen("in3667.txt","r",stdin); int n,m,w,index; scanf("%d%d",&n,&m); Build(1,n,1); while(m--){ int op; scanf("%d",&op); if(op == 1){ scanf("%d",&w); index = Query(w,1); printf("%d\n",index); if(index) UpdateInterval(1,index,index+w-1,1); }else{ int l,len; scanf("%d%d",&l,&len); UpdateInterval(0,l,l+len-1,1); } } return 0;}
阅读全文
1 0
- 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 (线段树)
- POJ.3667 Hotel ( 线段树 )
- poj Hotel 线段树
- POJ 3667 Hotel 线段树区间合并
- C++注释规范
- 关于“如何保证自己开发的软件只能在一台电脑上运行问题”的思考
- sql语句优化
- 【数据结构】中缀表达式转换为后缀表达式
- java 推箱子 两个箱子 两个位置 ,练习java二维数组
- POJ.3667 Hotel ( 线段树 )
- 考试规律
- css外边距合并
- ReactNative开发(三)之布局详解
- vlc隐藏toolbar
- Android 视频播放我选这个
- leetcode 股票收益问题
- PHP之array_rand()方法
- Git使用方法总结——Git 安装