POJ3667 hotel
来源:互联网 发布:mac rvm 安装ruby 编辑:程序博客网 时间:2024/06/06 09:48
题目链接:http://poj.org/problem?id=3667
线段树区间合并的入门题,区间合并和就是求什么最长连续什么什么的,所以说需要记录三个值,左起向右最长长度,右起向左最长长度,还有当前区间总最长长度,当前节点的总最长连续长度可由它的左子树和右子树推知,讲的话太麻烦……代码把
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn = 55555;int lsum[maxn<<2], rsum[maxn<<2], msum[maxn<<2], cover[maxn<<2];void PushDown(int rt, int m){ if (cover[rt] != -1){ cover[rt<<1] = cover[rt<<1|1] = cover[rt]; lsum[rt<<1] = rsum[rt<<1] = msum[rt<<1] = cover[rt] ? 0 : m - (m >> 1); lsum[rt<<1|1] = rsum[rt<<1|1] = msum[rt<<1|1] = cover[rt] ? 0 : (m >> 1); cover[rt] = -1; }}void PushUp(int rt, int m){ lsum[rt] = lsum[rt<<1]; rsum[rt] = rsum[rt<<1|1]; if (lsum[rt] == m - (m >> 1)) lsum[rt] += lsum[rt<<1|1];//如果左起向右连续长度等于左子树区间总长度,右子树左起最长连续长度加入进去才是左起总的最长连续长度,下面的右子树同理 if (rsum[rt] == (m >> 1)) rsum[rt] += rsum[rt<<1]; msum[rt] = max(lsum[rt<<1|1] + rsum[rt<<1], max(msum[rt<<1], msum[rt<<1|1]));//推知当前区间总的连续长度}void build(int l, int r, int rt){ lsum[rt] = rsum[rt] = msum[rt] = r - l + 1; cover[rt] = -1; if (l == r) return; int m = (l + r) >> 1; build(lson); build(rson);}void update(int ll, int rr, int c, int l, int r, int rt){ if (ll <= l && rr >= r){ lsum[rt] = rsum[rt] = msum[rt] = c ? 0 : r - l + 1; cover[rt] = c; return; } PushDown(rt, r - l + 1); int m = (l + r) >> 1; if (ll <= m) update(ll, rr, c, lson); if (rr > m) update(ll, rr, c, rson); PushUp(rt, r - l + 1);}int query(int w, int l, int r, int rt){ if (l == r) return l; PushDown(rt, r - l + 1); int m = (l + r) >> 1; if (msum[rt<<1] >= w) return query(w, lson); else if (lsum[rt<<1|1] + rsum[rt<<1] >= w) return m - rsum[rt<<1] + 1; return query(w, rson);}int main(){ int n, m; while (~scanf("%d%d", &n, &m)){ build(1, n, 1); while (m--){ int op, a, b; scanf("%d", &op); if (op == 1){ scanf("%d", &a); if (msum[1] < a) printf("0\n"); else{ int p = query(a, 1, n, 1); printf("%d\n", p); update(p, p + a - 1, 1, 1, n, 1); } } else{ scanf("%d%d", &a, &b); update(a, a + b - 1, 0, 1, n, 1); } } } return 0;}
- POJ3667 Hotel
- POJ3667 hotel
- POJ3667--Hotel
- poj3667 Hotel
- POJ3667 Hotel
- POJ3667---Hotel
- poj3667 Hotel
- poj3667 Hotel
- POJ3667 Hotel
- poj3667 Hotel
- 【poj3667】Hotel
- POJ3667 Hotel
- 【poj3667】【线段树】Hotel
- 【线段树】Hotel POJ3667
- POJ3667 Hotel(线段树)
- 线段树 poj3667 Hotel
- 【POJ3667】Hotel-线段树
- POJ3667--Hotel(区间合并)
- IAR环境下中断函数无反应
- 新建.修改.删除 三按钮工作流程
- Android解决程序启动时的黑屏问题
- event.target在IE和其它浏览器中的问题
- 基于TQ2440A开发板的系统安装过程
- POJ3667 hotel
- 趣味问题(1 2 3 4 5 6 7 8 9 = 110)
- Android百度地图使用
- rsync 错误报告及解决方法
- 华天正的开发板如何修改MAC的地址
- 移植openssh至arm9嵌入式开发板
- 获取磁盘序列号GetVolumeInformation
- Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率
- 三角形类——一个无参数一个有参数(用参数的初始化表对数据成员初始化)