POJ 3667 Hotel(线段树)
POJ 3667 Hotel
题目链接
题意:有n个房间,如今有两个操作
1、找到连续长度a的空房间。入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0
2、清空[a, a + b - 1]的房间
思路:线段树的区间合并。记录下左边连续最长和右边连续最长空房间。和每一段的最大值。这样pushup的时候就是进行区间合并,注意查询的时候因为是要尽量左,所以先查左孩子,在查横跨左右的,在查右孩子
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define lson(x) ((x<<1)+1)
#define rson(x) ((x<<1)+2)const int N = 50005;int n, m;struct Node {int l, r, lsum, rsum, sum, sumv, lazy;int size() {return r - l + 1;}void gao(int v) {lazy = v;if (v) lsum = rsum = sum = 0;else lsum = rsum = sum = r - l + 1;sumv = l;}
} node[N * 4];void pushup(int x) {if (node[lson(x)].lsum == node[lson(x)].size()) node[x].lsum = node[lson(x)].lsum + node[rson(x)].lsum;else node[x].lsum = node[lson(x)].lsum;if (node[rson(x)].rsum == node[rson(x)].size()) node[x].rsum = node[lson(x)].rsum + node[rson(x)].rsum;else node[x].rsum = node[rson(x)].rsum;node[x].sum = node[lson(x)].sum;node[x].sumv = node[lson(x)].sumv;if (node[x].sum < node[lson(x)].rsum + node[rson(x)].lsum) {node[x].sum = node[lson(x)].rsum + node[rson(x)].lsum;node[x].sumv = node[lson(x)].r - node[lson(x)].rsum + 1;}if (node[x].sum < node[rson(x)].sum) {node[x].sum = node[rson(x)].sum;node[x].sumv = node[rson(x)].sumv;}
}void pushdown(int x) {if (node[x].lazy != -1) {node[lson(x)].gao(node[x].lazy);node[rson(x)].gao(node[x].lazy);node[x].lazy = -1;}
}void build(int l, int r, int x = 0) {node[x].l = l; node[x].r = r; node[x].lazy = -1;if (l == r) {node[x].lsum = node[x].rsum = node[x].sum = 1;return;}int mid = (l + r) / 2;build(l, mid, lson(x));build(mid + 1, r, rson(x));pushup(x);
}void add(int l, int r, int v, int x = 0) {if (node[x].l >= l && node[x].r <= r) {node[x].gao(v);return;}int mid = (node[x].l + node[x].r) / 2;pushdown(x);if (l <= mid) add(l, r, v, lson(x));if (r > mid) add(l, r, v, rson(x));pushup(x);
}int query(int v, int x = 0) {if (node[x].l == node[x].r) {if (node[x].sum >= v) return node[x].sumv;return 0;}pushdown(x);int ans = 0;if (node[lson(x)].sum >= v)ans = query(v, lson(x));else if (node[lson(x)].rsum + node[rson(x)].lsum >= v) ans = node[lson(x)].r - node[lson(x)].rsum + 1;else if (node[rson(x)].sum >= v)ans = query(v, rson(x));pushup(x);return ans;
}int main() {while (~scanf("%d%d", &n, &m)) {build(1, n);int op, a, b;while (m--) {scanf("%d%d", &op, &a);if (op == 2) {scanf("%d", &b);add(a, a + b - 1, 0);} else {int tmp = query(a);printf("%d\n", tmp);if (tmp == 0) continue;add(tmp, tmp + a - 1, 1);}}}return 0;
}
POJ 3667 Hotel(线段树)相关推荐
- POJ 3667 Hotel 线段树区间合并
线段树的区间合并,其中lsum代表区间左边最大连续长度,rsum代表区间最大连续长度,msum代表区间 最大连续长度.因为本题是查询连续区间的左端点,那么如果左儿子满足条件,就继续查询左儿子,左儿 子 ...
- 【转】poj 1823 hotel 线段树【Good】
题意:一个hotel,有n个连续的房间,开始时均无人住宿 共有3种操作 1 a b 从a开始连续b个房间全部旅客住宿 [a,a+b-1]; 2 a b 从a开始连续b个房间全部旅客离开 [a,a+b- ...
- HDU - 3667 Hotel(线段树+区间合并)
题目链接:点击查看 题目大意:给出n个连续的空房间,依次进行m个操作,操作一是查询操作,查询在总区间内的一段连续的长度为x的空房间,并 且该位置要靠左,如果查询到返回最左边的端点,并将其占用,找不到返 ...
- POJ 2352 Stars (线段树)
POJ 2352 Stars (线段树) 手动博客搬家:本文发表于20170819 22:11:49, 原地址https://blog.csdn.net/suncongbo/article/detai ...
- poj Hotel 线段树
经典线段树的题. 每个节点存储的信息:左端点连续空房间的长度,右端点连续空房间长度,连续空房间的最大长度. 由于要求每次必须从尽量靠左边的位置进行居住,那么搜索时应尽量让区间起始位置更小: 1.如果当 ...
- poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★
poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...
- poj 2352 Stars(线段树)
题目:http://poj.org/problem?id=2352 大意:一些星星有自己的优先级,优先级是x坐标和y坐标小于等于该星星坐标的星星个数 思路:由于这个题的y值是从小到大排列,所以对x建立 ...
- POJ 2299 Ultra-QuickSort(线段树+离散化)
题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...
- poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化
第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...
最新文章
- 12 集成测试方法之大棒集成方法
- mysql 新建子查询_Mysql创建SQL子查询ALIAS
- 中国系统集成商名单大全
- ConcurrentHashMap的源码分析-tabAt
- 常用的函数式接口_Predicate接口
- mysql中having的例子_有关mysql中having子句对组记录进行筛选的例子
- #paragma详解
- [233]树莓派裸机代码bootloader学习总结
- 使用3DMM进行人脸重建中的配准方法
- aso核心,影响ASO优化的核心问题大汇总
- 老人与海好词100英文带翻译_英语好词好句摘抄 老人与海 英文版 好词好句摘抄...
- android7.0后台,安卓7.0带来一键清理后台 真能使手机变快吗
- 微软视窗的C++封装
- 2380318-57-8,Thalidomide-O-PEG4-Azide通过点击化学与炔烃或DBCO、BCN连接的分子反应的PROTAC连接物
- 【PostgreSQL实战】之还原备份文件
- Word文件总页码不含首页和目录设置方法
- Deep Learning 最优化方法
- mac 关闭系统完整性保护 SIP(System Integrity Protection)的方法
- scikit-learn源码学习之cluster.MeanShift
- android.view.InflateException: Binary XML file line #10: Error inflating class com.android.xiong.han
热门文章
- catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文
- python信用卡违约_Python信用卡验证
- 山东大学计算机学院预推免,山东大学计算机科学与技术学院(专业学位)计算机技术保研...
- java计算器的重点解决问题_java计算器问题
- 用python客户画像代码_客户画像与标签体系-Python数据科学技术详解与商业项目实战精讲 - Python学习网...
- python tkinter设置窗口大小_Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例...
- java iso8583 socket 服务_JAVA客户端amp;服务器的socket通信
- 【java】兴唐第十七节课
- C语言——冒泡法排序应用
- devServer proxy跨域 设置代理 proxy