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(线段树)相关推荐

  1. POJ 3667 Hotel 线段树区间合并

    线段树的区间合并,其中lsum代表区间左边最大连续长度,rsum代表区间最大连续长度,msum代表区间 最大连续长度.因为本题是查询连续区间的左端点,那么如果左儿子满足条件,就继续查询左儿子,左儿 子 ...

  2. 【转】poj 1823 hotel 线段树【Good】

    题意:一个hotel,有n个连续的房间,开始时均无人住宿 共有3种操作 1 a b 从a开始连续b个房间全部旅客住宿 [a,a+b-1]; 2 a b 从a开始连续b个房间全部旅客离开 [a,a+b- ...

  3. HDU - 3667 Hotel(线段树+区间合并)

    题目链接:点击查看 题目大意:给出n个连续的空房间,依次进行m个操作,操作一是查询操作,查询在总区间内的一段连续的长度为x的空房间,并 且该位置要靠左,如果查询到返回最左边的端点,并将其占用,找不到返 ...

  4. POJ 2352 Stars (线段树)

    POJ 2352 Stars (线段树) 手动博客搬家:本文发表于20170819 22:11:49, 原地址https://blog.csdn.net/suncongbo/article/detai ...

  5. poj Hotel 线段树

    经典线段树的题. 每个节点存储的信息:左端点连续空房间的长度,右端点连续空房间长度,连续空房间的最大长度. 由于要求每次必须从尽量靠左边的位置进行居住,那么搜索时应尽量让区间起始位置更小: 1.如果当 ...

  6. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

  7. poj 2352 Stars(线段树)

    题目:http://poj.org/problem?id=2352 大意:一些星星有自己的优先级,优先级是x坐标和y坐标小于等于该星星坐标的星星个数 思路:由于这个题的y值是从小到大排列,所以对x建立 ...

  8. POJ 2299 Ultra-QuickSort(线段树+离散化)

    题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...

  9. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化

    第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...

最新文章

  1. 12 集成测试方法之大棒集成方法
  2. mysql 新建子查询_Mysql创建SQL子查询ALIAS
  3. 中国系统集成商名单大全
  4. ConcurrentHashMap的源码分析-tabAt
  5. 常用的函数式接口_Predicate接口
  6. mysql中having的例子_有关mysql中having子句对组记录进行筛选的例子
  7. #paragma详解
  8. [233]树莓派裸机代码bootloader学习总结
  9. 使用3DMM进行人脸重建中的配准方法
  10. aso核心,影响ASO优化的核心问题大汇总
  11. 老人与海好词100英文带翻译_英语好词好句摘抄 老人与海 英文版 好词好句摘抄...
  12. android7.0后台,安卓7.0带来一键清理后台 真能使手机变快吗
  13. 微软视窗的C++封装
  14. 2380318-57-8,Thalidomide-O-PEG4-Azide通过点击化学与炔烃或DBCO、BCN连接的分子反应的PROTAC连接物
  15. 【PostgreSQL实战】之还原备份文件
  16. Word文件总页码不含首页和目录设置方法
  17. Deep Learning 最优化方法
  18. mac 关闭系统完整性保护 SIP(System Integrity Protection)的方法
  19. scikit-learn源码学习之cluster.MeanShift
  20. android.view.InflateException: Binary XML file line #10: Error inflating class com.android.xiong.han

热门文章

  1. catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文
  2. python信用卡违约_Python信用卡验证
  3. 山东大学计算机学院预推免,山东大学计算机科学与技术学院(专业学位)计算机技术保研...
  4. java计算器的重点解决问题_java计算器问题
  5. 用python客户画像代码_客户画像与标签体系-Python数据科学技术详解与商业项目实战精讲 - Python学习网...
  6. python tkinter设置窗口大小_Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例...
  7. java iso8583 socket 服务_JAVA客户端amp;服务器的socket通信
  8. 【java】兴唐第十七节课
  9. C语言——冒泡法排序应用
  10. devServer proxy跨域 设置代理 proxy