Description

The "Informatics" hotel is one of the most luxurious hotels from Galaciuc. A lot of tourists arrive or leave this hotel in one year. So it is pretty difficult to keep the evidence of the occupied rooms. But this year the owner of the hotel decided to do some changes. That's why he engaged you to write an efficient program that should respond to all his needs.

Write a program that should efficiently respond to these 3 types of instructions: 
type 1: the arrival of a new group of tourists 
A group of M tourists wants to occupy M free consecutive rooms. The program will receive the number i which represents the start room of the sequence of the rooms that the group wants to occupy and the number M representing the number of members of the group. It is guaranteed that all the rooms i,i+1,..,i+M-1 are free at that moment. 
type 2: the departure of a group of tourists 
The tourists leave in groups (not necessarilly those groups in which they came). A group with M members leaves M occupied and consecutive rooms. The program will receive the number i representing the start room of the sequence of the released rooms and the number M representing the number of members of the group. It is guaranteed that all the rooms i,i+1,..,i+M-1 are occupied. 
type 3: the owner's question 
The owner of the hotel may ask from time to time which is the maximal length of a sequence of free consecutive rooms. He needs this number to know which is the maximal number of tourists that could arrive to the hotel. You can assume that each room may be occupied by no more than one tourist. 

Input

On the first line of input, there will be the numbers N (3 <= N <= 16 000) representing the number of the rooms and P (3 <= P <= 200 000) representing the number of the instructions.

The next P lines will contain the number c representing the type of the instruction:

  • if c is 1 then it will be followed (on the same line) by 2 other numbers, i and M, representing the number of the first room distributed to the group and the number of the members
  • if c is 2 then it will be followed (on the same line) by 2 other numbers, i and M, representing the number of the first room that will be released and the number of the members of the group that is leaving
  • if c is 3 then it will not be followed by any number on that line, but the program should output in the output file the maximal length of a sequence of free and consecutive rooms

Output

In the output you will print for each instruction of type 3, on separated lines, the maximal length of a sequence of free and consecutive rooms. Before the first instruction all the rooms are free.

Sample Input

12 10
3
1 2 3
1 9 4
3
2 2 1
3
2 9 2
3
2 3 2
3

Sample Output

12
4
4
6
10

Source

【分析】
题目太水都不好意思发了。
贴诗。
 /*
唐代许浑
《咸阳城东楼 / 咸阳城西楼晚眺 / 西门》 一上高城万里愁,蒹葭杨柳似汀洲。
溪云初起日沉阁,山雨欲来风满楼。
鸟下绿芜秦苑夕,蝉鸣黄叶汉宫秋。
行人莫问当年事,故国东来渭水流。
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <utility>
#include <iomanip>
#include <string>
#include <cmath>
#include <queue>
#include <assert.h>
#include <map>
#include <ctime>
#include <cstdlib>
#include <stack>
#define LOCAL
const int MAXN = + ;
const int MAXM = + ;
const int INF = ;
const int SIZE = ;
const int maxnode = 0x7fffffff + ;
using namespace std;
int i;
struct SEGTREE{
struct Node{
int l, r;
int rmax, mmax, lmax;//分别代表从左边开始的最长,从右边开始的最长和中间的最长
int delta; /*void Count(){
rmax = lmax = mmax = 0;
for (int i = l; i <= r; i++) if (data[i] == 0){lmax = i - l;break;}
for (int i = r; i >= l; i--) if (data[i] == 0){rmax = r - i;break;}
int t = 0;
for (int i = l; i <= r; i++){ }
}*/
}tree[MAXN * ]; void pushdown(int t){
if (tree[t].delta != -){
if (tree[t].delta == ) {//全1
tree[(t<<)].lmax = tree[(t<<)].rmax = tree[(t<<)].mmax = tree[(t<<)].r - tree[(t<<)].l + ;tree[(t<<)].delta = ;
tree[(t<<) | ].lmax = tree[(t<<) | ].rmax = tree[(t<<) | ].mmax = tree[(t<<) | ].r - tree[(t<<) | ].l + ;tree[(t<<) | ].delta = ;
tree[t].delta = -;
}else{
tree[(t<<)].lmax = tree[(t<<)].rmax = tree[(t<<)].mmax = ;tree[(t<<)].delta = ;
tree[(t<<) | ].lmax = tree[(t<<) | ].rmax = tree[(t<<) | ].mmax = ;tree[(t<<) | ].delta = ;
tree[t].delta = -;
}
}
}
//更新
void update(int t){
tree[t].mmax = max(tree[t<<].mmax, max(tree[(t<<)|].mmax, tree[t<<].rmax + tree[(t<<)|].lmax));
//更新tree[t]的lmax
if (tree[t<<].lmax == tree[t<<].r - tree[t<<].l + ) tree[t].lmax = tree[t<<].lmax + tree[(t<<)|].lmax;
else tree[t].lmax = tree[t<<].lmax; //同理
if (tree[(t<<)|].rmax == tree[(t<<)|].r - tree[(t<<)|].l + ) tree[t].rmax = tree[t<<].rmax + tree[(t<<)|].rmax;
else tree[t].rmax = tree[(t<<)|].rmax;
}
void build(int t, int l, int r){
tree[t].l = l;
tree[t].r = r;
tree[t].lmax = tree[t].mmax = tree[t].rmax = tree[t].r - tree[t].l + ;
tree[t].delta = -;
if (l == r) return;
int mid = (l + r) >> ;
build(t << , l, mid);
build((t << )|, mid + , r);
}
void insert(int t, int l, int r, int val){//t为节点编号,val为权值
pushdown(t);
if (l <= tree[t].l && tree[t].r <= r){
if (val == ) {tree[t].rmax = tree[t].lmax = tree[t].mmax = tree[t].r - tree[t].l + ;tree[t].delta = ;}
else {tree[t].rmax = tree[t].lmax = tree[t].mmax = ;tree[t].delta = ;}
return;
}
int mid = (tree[t].l + tree[t].r)>>;
//if (i == 3 && tree[t].l == 10 && tree[t].r == 11)
//printf("");
if (l <= mid) insert(t << , l, r , val);
if (r > mid) insert((t << ) | , l, r, val); update(t);
}
}A;
int n, p; void init(){
scanf("%d%d", &n, &p);
A.build(, , n);
}
void work(){
for (i = ; i <= p; i++){
int t;
scanf("%d", &t);
if (t == ) printf("%d\n", A.tree[].mmax);
else if (t == ){
int l, r;
scanf("%d%d", &l, &r);
A.insert(, l, l + r - , );
}else if (t == ){
int l, r;
scanf("%d%d", &l, &r);
A.insert(, l, l + r - , );
}
}
} int main(){ init();
work();
return ;
}

【POJ1823】【线段树】Hotel的更多相关文章

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

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  2. ACM: Hotel 解题报告 - 线段树-区间合并

    Hotel Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description The ...

  3. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  4. poj 3667 Hotel (线段树)

    http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 94 ...

  5. PKU 3667 Hotel(线段树)

    Hotel The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...

  6. Hotel(线段树合并)

    Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14958   Accepted: 6450 Descriptio ...

  7. 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel

    题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...

  8. poj3667 Hotel (线段树 区间合并)

    poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...

  9. 洛谷P2894 [USACO08FEB]酒店Hotel [线段树]

    题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...

  10. Poj 3667——hotel——————【线段树区间合并】

    Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13124   Accepted: 5664 Descriptio ...

随机推荐

  1. 【转】Word中使用Endnote很卡解决方案

    [转自]:http://blog.sina.com.cn/s/blog_4aee288a0101cxwb.html 文件→选项→校对→在word中更正拼写和语法时→键入时标记语法错误. 取消这个选项, ...

  2. Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区

    Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区 undefined

  3. cas 单点登录配置

    服务端配置 cas是个好东西,很灵活很好用,但是配置起来很麻烦 cas官方网站 http://downloads.jasig.org/ 下载服务端 CAS Server 3.3.3 Final 1.将 ...

  4. Oracle中trunc函数、round 函数、ceil函数和floor函数的使用

    Oracle中trunc函数.round 函数.ceil函数和floor函数的使用 1.1trunc函数处理数字 trunc函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定 ...

  5. 深入浅出node(4) 异步编程

    一)函数式编程基础 二)异步编程的优势和难点 2.1 优势 2.2 难点 2.2.1 异常处理 2.2.2 函数嵌套过深 2.2.3 阻塞 2.2.4 多线程编程 2.2.5 异步转同步 三)异步编程 ...

  6. Maven实现Web应用集成測试自己主动化 -- 部署自己主动化(WebTest Maven Plugin)

    上篇:Maven实现Web应用集成測试自己主动化 -- 測试自己主动化(WebTest Maven Plugin) 之前介绍了怎样在maven中使用webtest插件实现web的集成測试,这里有个遗留 ...

  7. Windows内核之线程的调度,优先级,亲缘性

    1 调度 Windows不是实时操作系统,它是抢占式多线程操作系统.在如果全部优先级同样的情况下,CPU对线程的调度原则是每隔20m就会切换到下一个线程,依据Context中的IP和SP来接着运行上次 ...

  8. MapReduce优化

    Combiner和Partitioner是用来优化MapReduce的,可以提高MapReduce的运行效率.下面我们来具体学习这两个组件 Combiner 我们以WordCount为例,首先通过下面 ...

  9. JSP-注释,脚本元素,指令

    jsp中的注释 jsp隐藏注释 完全对客户机隐藏,不会将注释内容发送给客户机. 其语法格式为:<%-- comment --%> comment为要添加的文本注释内容. HTML注释 不完 ...

  10. mysql查看端口

    在你的my.ini(Windows)或my.cfg(Linux) 中就有啊. 或者如果已经连入MySQL可以直接 SQL code ? 1 2 3 4 5 6 7 8 9 mysql> show ...