poj Hotel 线段树
来源:互联网 发布:黑色五叶草 知乎 编辑:程序博客网 时间:2024/05/22 04:27
经典线段树的题。
每个节点存储的信息:左端点连续空房间的长度,右端点连续空房间长度,连续空房间的最大长度。
由于要求每次必须从尽量靠左边的位置进行居住,那么搜索时应尽量让区间起始位置更小:
1.如果当前区间的最大空房间长度小于要寻找的长度,说明不会找到符合的区间,直接退出。
2.如果左子区间的最大空房间长度大于等于要寻找的长度,那么应该进入左子区间查找。
3.否则,如果左子区间的右端点连续空房间长度 + 右子区间的左端点连续空房间的长度 大于等于要寻找的长度则直接返回左子区间右端点起始空房间下标。
4.否则,进入右区间寻找。
AC代码:
#include<cstdio>#include<algorithm>using namespace std;const int maxn = 2e5;struct node{int l, r;int len, lenl, lenr;int tag; //0代表全空 1代表全满 -1代表混杂 }t[maxn];void build(int l, int r, int cur){t[cur].l = l, t[cur].r = r;t[cur].len = t[cur].lenl = t[cur].lenr = r - l + 1;t[cur].tag = 0; if(l == r) return;int mid = (l + r) / 2;build(l, mid, cur << 1);build(mid + 1, r, (cur << 1) + 1);}void lazy(int cur){ if(t[cur].l == t[cur].r) return;if(t[cur].tag >= 0) { //覆盖 int l = cur << 1, r = (cur << 1) + 1;int val;if(t[cur].tag == 0) val = t[l].r - t[l].l + 1;else val = 0;t[l].len = t[l].lenl = t[l].lenr = val;if(t[cur].tag == 0) val = t[r].r - t[r].l + 1;else val = 0;t[r].len = t[r].lenl = t[r].lenr = val;t[r].tag = t[l].tag = t[cur].tag;}}int search(int len, int cur){if(t[cur].len < len) return 0;int l = t[cur].l, r = t[cur].r;if(l == r) return l;lazy(cur);if(t[cur << 1].len >= len) return search(len, cur << 1);else if(t[cur << 1].lenr + t[(cur << 1) + 1].lenl >= len) return t[cur << 1].r - t[cur << 1].lenr + 1;else if(t[(cur << 1) + 1].len >= len) return search(len, (cur << 1) +1);}void update(int l, int r, int tag, int cur){int l1 = t[cur].l, r1 = t[cur].r;if(l1 == l && r1 == r){t[cur].tag = tag;int val;if(tag) val = 0;else val = r1 - l1 + 1;t[cur].len = t[cur].lenl = t[cur].lenr = val;return;}lazy(cur);int mid = (l1 + r1) / 2;if(r <= mid) update(l, r, tag, cur << 1);else if(l >= mid + 1) update(l, r, tag, (cur << 1) + 1);else {update(l, mid, tag, cur << 1);update(mid + 1, r, tag, (cur << 1) + 1);}int c1 = cur << 1, c2 = (cur << 1) + 1;int w = t[c1].lenr + t[c2].lenl;t[cur].lenl = t[c1].lenl, t[cur].lenr = t[c2].lenr;if(t[c1].tag == 0) t[cur].lenl = w;if(t[c2].tag == 0) t[cur].lenr = w;t[cur].len = max(t[c1].len, t[c2].len);t[cur].len = max(w, t[cur].len);t[cur].len = max(t[cur].len, t[cur].lenr);t[cur].len = max(t[cur].len, t[cur].lenl);if(t[cur].len == 0) t[cur].tag = 1;else if(t[cur].len == r1 - l1 + 1) t[cur].tag = 0;else t[cur].tag = -1;}int main(){int n,q;while(scanf("%d%d", &n, &q) == 2){build(1, n, 1);int a, b, c;for(int i = 0; i < q; ++i){scanf("%d", &a);if(a == 1){scanf("%d", &b);int x = search(b, 1);printf("%d\n", x);if(x != 0) update(x, x + b - 1, 1, 1);}else {scanf("%d%d", &b, &c);update(b, b + c - 1, 0, 1);}}}return 0;}
如有不当之处欢迎指出!
0 0
- poj Hotel 线段树
- POJ 3667 Hotel(线段树)
- 【线段树】poj 3667 Hotel
- POJ 3667 Hotel 线段树
- POJ 1823 Hotel 线段树
- poj 3667 hotel #线段树
- POJ-3667 Hotel[线段树]
- POJ 1823 Hotel 线段树
- POJ 3667 HOTEL 线段树
- poj 1823 Hotel 线段树
- POJ 3667 Hotel (线段树)
- poj 3667 Hotel 线段树
- POJ 3667 Hotel 线段树
- poj 3667 Hotel 线段树
- POJ 3667 Hotel 线段树
- 【线段树】 POJ 3667 Hotel
- POJ 1823 Hotel【线段树】
- poj 3667 Hotel(线段树)
- 服务器负载均衡的几种部署方式
- LeetCode: Combination Sum
- JS之全国省市二级联动
- 机器学习:分类算法
- 图形界面编程成就了C++
- poj Hotel 线段树
- 信息系统集成专业技术 考纲与考试要点
- 大型网站--负载均衡架构
- 终端通过sqlite语句 简单查看db数据库
- getResourceAsStream(“”)路径问题
- Angular2引导方式:基于JIT的动态引导和基于AOT的静态引导
- 关于AndroidStudio Gradle加载项目时间过长的原因及解决
- 测试最全网站
- loadrunner教程及常见问题汇总(一)