博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树(区间合并) POJ 3667 Hotel
阅读量:5947 次
发布时间:2019-06-19

本文共 2930 字,大约阅读时间需要 9 分钟。

 

/*    题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边            输入 2 a b:将[a,a+b-1]的房间清空    线段树(区间合并):lsum[]统计从左端点起最长连续空房间数,rsum[]类似,sum[]统计区间最长连续的空房间数,            它有三种情况:1.纯粹是左端点起的房间数;2.纯粹是右端点的房间数;3.当从左(右)房间起都连续时,加上另一个子节点            从左(右)房间起的数,sum[]再求最大值更新维护。理解没错,表达能力不足    详细解释:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html*/#include 
#include
#include
using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1const int MAXN = 5e4 + 10;const int INF = 0x3f3f3f3f;struct Segment_Tree { int sum[MAXN<<2], lsum[MAXN<<2], rsum[MAXN<<2], cover[MAXN<<2]; void push_up(int rt, int len) { lsum[rt] = lsum[rt<<1]; rsum[rt] = rsum[rt<<1|1]; if (lsum[rt] == len - (len>>1)) lsum[rt] += lsum[rt<<1|1]; if (rsum[rt] == len>>1) rsum[rt] += rsum[rt<<1]; sum[rt] = max (rsum[rt<<1] + lsum[rt<<1|1], max (sum[rt<<1], sum[rt<<1|1])); } void push_down(int rt, int len) { if (cover[rt] != -1) { cover[rt<<1] = cover[rt<<1|1] = cover[rt]; sum[rt<<1] = lsum[rt<<1] = rsum[rt<<1] = cover[rt] ? 0 : len - (len>>1); sum[rt<<1|1] = lsum[rt<<1|1] = rsum[rt<<1|1] = cover[rt] ? 0 : len >> 1; cover[rt] = -1; } } void build(int l, int r, int rt) { sum[rt] = lsum[rt] = rsum[rt] = r - l + 1; cover[rt] = -1; if (l == r) return ; int mid = (l + r) >> 1; build (lson); build (rson); } void updata(int ql, int qr, int c, int l, int r, int rt) { if (ql <= l && r <= qr) { sum[rt] = lsum[rt] = rsum[rt] = c ? 0 : (r - l + 1); cover[rt] = c; return ; } push_down (rt, r - l + 1); int mid = (l + r) >> 1; if (ql <= mid) updata (ql, qr, c, lson); if (qr > mid) updata (ql, qr, c, rson); push_up (rt, r - l + 1); } int query(int w, int l, int r, int rt) { if (l == r) return l; push_down (rt, r - l + 1); int mid = (l + r) >> 1; if (sum[rt<<1] >= w) return query (w, lson); else if (rsum[rt<<1] + lsum[rt<<1|1] >= w) return mid - rsum[rt<<1] + 1; else return query (w, rson); }}st;int main(void) { //POJ 3667 Hotel int n, m; while (scanf ("%d%d", &n, &m) == 2) { st.build (1, n, 1); for (int i=1; i<=m; ++i) { int op, a, b; scanf ("%d%d", &op, &a); if (op == 1) { if (st.sum[1] < a) puts ("0"); else { int p = st.query (a, 1, n, 1); printf ("%d\n", p); st.updata (p, p + a - 1, 1, 1, n, 1); } } else { scanf ("%d", &b); st.updata (a, a + b - 1, 0, 1, n, 1); } } } return 0;}

  

转载于:https://www.cnblogs.com/Running-Time/p/4686455.html

你可能感兴趣的文章
SegmentFault 2017 年社区周报 Vol.5
查看>>
JS用原型对象写的贪吃蛇,很粗糙的代码
查看>>
mac安装consul
查看>>
JavaScript深入之bind的模拟实现
查看>>
Learning Notes - Understanding the Weird Parts of JavaScript
查看>>
SegmentFault 2017 年社区周报 Vol.4
查看>>
两种方式javascript实现图片预览
查看>>
数据结构面试 之 单链表是否有环及环入口点 附有最详细明了的图解
查看>>
RancherOS v0.8.0发布:支持离线安装,更佳部署体验
查看>>
AI+社交,快手商业化落地之道
查看>>
Microsoft Graph:连接每个应用都需要的基础数据
查看>>
Latex格式html文件转换pdf和docx文档
查看>>
【关于Number】JavaScript中关于Number的操作
查看>>
非泄露,NSA官方开源反汇编工具GHIDRA
查看>>
保持分布式团队同步
查看>>
Node.js v7 Beta版引入citgm
查看>>
微服务没有银弹 | Weibo Mesh 的工程化实践解读
查看>>
让你的系统“坚挺不倒”的最后一个大招——「降级」
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
搭载AI引擎,腾讯云云镜开启全面防护模式
查看>>