首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
pojHotel 线段树
时间:
2015-07-25 18:33:58
阅读:
115
评论:
0
收藏:
0
[点我收藏+]
标签:
//空间分配
//1 x 找连续的长度为x的空间
//2 x d [x,x+d-1]空间的占用清除
//维护ma_l , ma_r , ma分别为左边的空闲空间,右边的空闲空间和最大的空闲空间
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 50010 ;
#define left v<<1
#define right v<<1|1
struct node
{
int l , r , lazy ;
int ma_l , ma_r , ma ;
}tree[maxn<<2] ;
void build(int l , int r , int v)
{
tree[v].l = l ;
tree[v].r = r;
tree[v].lazy = -1 ;
tree[v].ma = tree[v].ma_l = tree[v].ma_r = (r - l + 1) ;
if(l == r)return ;
int mid = (l + r) >> 1 ;
build(l , mid , left) ;
build(mid + 1 , r , right) ;
}
void push_down(int v)
{
if(tree[v].lazy != -1)
{
tree[left].ma_l = tree[left].ma_r = tree[left].ma = (tree[left].r - tree[left].l + 1)*tree[v].lazy ;
tree[right].ma_l = tree[right].ma_r = tree[right].ma = (tree[right].r - tree[right].l + 1)*tree[v].lazy ;
tree[left].lazy = tree[right].lazy = tree[v].lazy ;
tree[v].lazy = -1 ;
}
}
void push_up(int v)
{
tree[v].ma_l = tree[left].ma_l ;
tree[v].ma_r = tree[right].ma_r ;
tree[v].ma = max(max(tree[left].ma , tree[right].ma) , tree[left].ma_r + tree[right].ma_l);
if(tree[v].ma_l == (tree[left].r - tree[left].l + 1))
tree[v].ma_l += tree[right].ma_l;
if(tree[v].ma_r == (tree[right].r - tree[right].l + 1))
tree[v].ma_r += tree[left].ma_r ;
}
void update(int l , int r, int v , int op)
{
if(l <= tree[v].l && tree[v].r <= r)
{
tree[v].ma_l = tree[v].ma_r = tree[v].ma = (tree[v].r - tree[v].l + 1)*op ;
tree[v].lazy = op ;
return ;
}
push_down(v) ;
int mid = (tree[v].l + tree[v].r) >> 1 ;
if(l <= mid)update(l , r , left , op) ;
if(r > mid)update(l , r ,right , op) ;
push_up(v) ;
}
int query(int v , int num)
{
if(tree[v].l == tree[v].r)
return tree[v].l ;
push_down(v) ;
int mid = (tree[v].l + tree[v].r) >> 1 ;
if(tree[left].ma >= num)
return query(left , num) ;
else if(tree[left].ma_r + tree[right].ma_l >= num)
return tree[left].r - tree[left].ma_r + 1 ;
else return query(right , num) ;
}
int main()
{
//freopen("in.txt" ,"r" , stdin) ;
int n , m ;
while(~scanf("%d%d" , &n , &m))
{
build(1 , n , 1) ;
while(m--)
{
int op , d , x ;
scanf("%d" , &op) ;
if(op == 1)
{
scanf("%d" ,&x) ;
int ans = query(1 , x) ;
if(tree[1].ma < x){puts("0");continue ;}
printf("%d\n" ,ans) ;
update(ans , ans + x - 1 , 1 , 0) ;
}
else if(op == 2)
{
scanf("%d%d" ,&x , &d) ;
update(x , x+d-1 , 1 , 1) ;
}
}
}
return 0 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
pojHotel 线段树
标签:
原文地址:http://blog.csdn.net/cq_pf/article/details/47057951
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!