
正文
UESTC 1227 & POJ 3667 Hotel
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
非常细腻的线段树题目啊,后来还是有个细节写错了,查了一个晚上。。就不分析了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <utility>
#include <cstdlib>
using namespace std;
#define N 80011struct node
{
int ls,rs,ms;
int pos;
int mark; // 0: unsure 1: all-empty 2: all-full
}tree[*N];int n,m;void build(int l,int r,int rt)
{
tree[rt].ls = tree[rt].rs = tree[rt].ms = r-l+;
tree[rt].pos = l;
if(l == r)
{
return;
}
int mid = (l+r)/;
build(l,mid,*rt);
build(mid+,r,*rt+);
}int if_all_empty(int l,int r,int rt)
{
if(tree[rt].ls == r-l+)
return ;
return ;
}void update(int l,int r,int rt)
{
if(!tree[rt].mark)
return;
if(tree[rt].mark == ) //全空,则下传给左右子树
{
int len = r-l+;
tree[*rt].ls = tree[*rt].rs = tree[*rt].ms = (len+)/;
tree[*rt].pos = l;
tree[*rt+].ls = tree[*rt+].rs = tree[*rt+].ms = len/;
tree[*rt+].pos = (l+r)/+;
tree[*rt].mark = tree[*rt+].mark = ;
}
else if(tree[rt].mark == ) //全满,则下传给左右子树
{
tree[*rt].ls = tree[*rt].rs = tree[*rt].ms = ;
tree[*rt].pos = l;
tree[*rt+].ls = tree[*rt+].rs = tree[*rt+].ms = ;
tree[*rt+].pos = (l+r)/+;
tree[*rt].mark = tree[*rt+].mark = ;
}
tree[rt].mark = ; // not "== 0"
}int query(int l,int r,int dis,int rt)
{
update(l,r,rt);
if(tree[rt].ms<dis)
return ;
if(tree[rt].ms == dis)
return tree[rt].pos;
int mid = (l+r)/;
if(tree[*rt].ms>=dis)
return query(l,mid,dis,*rt);
if(tree[*rt].rs + tree[*rt+].ls>=dis)
return mid - tree[*rt].rs + ;
return query(mid+,r,dis,*rt+);
}void in_out(int l,int r,int aa,int bb,int flag,int rt) //flag == 1: insert else quit
{
if(aa>r||bb<l)
return;
if(aa<=l&&bb>=r)
{
if(flag == ) //如果当前要入住
{
tree[rt].ls = tree[rt].rs = tree[rt].ms = ;
tree[rt].pos = l;
tree[rt].mark = ;
}
else //如果当前要退房
{
tree[rt].ls = tree[rt].rs = tree[rt].ms = r-l+;
tree[rt].pos = l;
tree[rt].mark = ;
}
return;
}
update(l,r,rt);
int mid = (l+r)/;
in_out(l,mid,aa,bb,flag,*rt);
in_out(mid+,r,aa,bb,flag,*rt+); tree[rt].ls = tree[*rt].ls;
if(if_all_empty(l,mid,*rt))
tree[rt].ls += tree[*rt+].ls;
tree[rt].rs = tree[*rt+].rs;
if(if_all_empty(mid+,r,*rt+))
tree[rt].rs += tree[*rt].rs; tree[rt].ms = max(tree[*rt].rs+tree[*rt+].ls,max(tree[*rt].ms,tree[*rt+].ms)); if(tree[rt].ms == tree[*rt].ms) //如果当前区间最大空房数等于左子树最大空房数
tree[rt].pos = tree[*rt].pos; //则起点置为左子树的起点 else if(tree[rt].ms == tree[*rt].rs + tree[*rt+].ls) //同理
tree[rt].pos = mid - tree[*rt].rs + ; else
tree[rt].pos = tree[*rt+].pos;
}int main()
{
scanf("%d%d",&n,&m);
memset(tree,,sizeof(tree));
build(,n,);
int i,flag;
int x,dis;
for(i=;i<m;i++)
{
scanf("%d",&flag);
if(flag == )
{
scanf("%d",&dis);
int ans = query(,n,dis,);
printf("%d\n",ans);
if(ans)
in_out(,n,ans,ans+dis-,,);
}
else if(flag == )
{
scanf("%d%d",&x,&dis);
in_out(,n,x,x+dis-,,);
}
}
return ;
}
UESTC 1227 & POJ 3667 Hotel的更多相关文章- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- POJ 3667 Hotel(线段树)
POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...
- poj 3667 Hotel (线段树)
http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 94 ...
- POJ 3667 Hotel (线段树区间合并)
题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...
- POJ 3667 Hotel(线段树+区间合并)
http://poj.org/problem?id=3667 题意: 有N个房间,M次操作.有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示 ...
- POJ 3667 Hotel (线段树区间合并)
题目链接:http://poj.org/problem?id=3667 题目大意:一共有n个房间,初始时都是空的,现在有m个操作,操作有以下两种: 1.1 d :询问是否有连续d个空的房间,若有则输出 ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- poj 3667 Hotel(线段树,区间合并)
Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...
- (简单) POJ 3667 Hotel,线段树+区间合并。
Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...
随机推荐- CountDownLatch
使用的实例: @Override public <V> V get(Future<V> future) { final CountDownLatch l = new Count ...
- Ultra-QuickSort
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 44489 Accepted: 16176 ...
- C++学习笔记之由文本文件读取数据到vector模板建立的二维数组 并存储为新的文本文件
阅读本文可首先参考: C++学习笔记之输入.输出和文件 测试数据: /*读取txt文件到二维数组*/ #include <iostream> #include <fstream> ...
- c#语言基础编程-转义符
C#转义字符: 引言 为了在程序中能够控制字符的输出以及区分开双引号和单引号(双引号和单引号在程序中标示里面的内容为字符串和字符),所以用一种特殊的字符常量:是·以反斜线"\"开头 ...
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
如何退出Activity?如何安全退出已调用多个Activity的Application? 退出Activity直接调用finish()方法 //用户点击back键就是退出一个Activity 退出 ...
- UVA 10277 Boastin&#39; Red Socks
#include <iostream> #include<cstdio> #include<cstring> using namespace std; unsign ...
- sublime自动保存设置
首选项——用户设置 (Preferences:Settings - User) 行末添加"save_on_focus_lost": true 注意用逗号分隔 保存即可 save_o ...
- BZOJ2040[2009国家集训队]拯救Protoss的故乡——模拟费用流+线段树+树链剖分
题目描述 在星历2012年,星灵英雄Zeratul预测到他所在的Aiur行星在M天后会发生持续性暴雨灾害,尤其是他们的首都.而Zeratul作为星灵族的英雄,当然是要尽自己最大的努力帮助星灵族渡过这场 ...
- matplotlib基础知识全面解析
图像基本知识: 通常情况下,我们可以将一副Matplotlib图像分成三层结构: 1.第一层是底层的容器层,主要包括Canvas.Figure.Axes: 2.第二层是辅助显示层,主要包括Axis.S ...
- Jmeter响应内容显示乱码问题的解决办法
Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码,原因应该是响应页面没有做编码处理,jmeter默认按照ISO-8859-1编码格式进行解析. 下面把解决步骤列一下: 现象:jmeter ...
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...
http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 94 ...
题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...
http://poj.org/problem?id=3667 题意: 有N个房间,M次操作.有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示 ...
题目链接:http://poj.org/problem?id=3667 题目大意:一共有n个房间,初始时都是空的,现在有m个操作,操作有以下两种: 1.1 d :询问是否有连续d个空的房间,若有则输出 ...
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...
Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...
- CountDownLatch
使用的实例: @Override public <V> V get(Future<V> future) { final CountDownLatch l = new Count ...
- Ultra-QuickSort
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 44489 Accepted: 16176 ...
- C++学习笔记之由文本文件读取数据到vector模板建立的二维数组 并存储为新的文本文件
阅读本文可首先参考: C++学习笔记之输入.输出和文件 测试数据: /*读取txt文件到二维数组*/ #include <iostream> #include <fstream> ...
- c#语言基础编程-转义符
C#转义字符: 引言 为了在程序中能够控制字符的输出以及区分开双引号和单引号(双引号和单引号在程序中标示里面的内容为字符串和字符),所以用一种特殊的字符常量:是·以反斜线"\"开头 ...
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
如何退出Activity?如何安全退出已调用多个Activity的Application? 退出Activity直接调用finish()方法 //用户点击back键就是退出一个Activity 退出 ...
- UVA 10277 Boastin&#39; Red Socks
#include <iostream> #include<cstdio> #include<cstring> using namespace std; unsign ...
- sublime自动保存设置
首选项——用户设置 (Preferences:Settings - User) 行末添加"save_on_focus_lost": true 注意用逗号分隔 保存即可 save_o ...
- BZOJ2040[2009国家集训队]拯救Protoss的故乡——模拟费用流+线段树+树链剖分
题目描述 在星历2012年,星灵英雄Zeratul预测到他所在的Aiur行星在M天后会发生持续性暴雨灾害,尤其是他们的首都.而Zeratul作为星灵族的英雄,当然是要尽自己最大的努力帮助星灵族渡过这场 ...
- matplotlib基础知识全面解析
图像基本知识: 通常情况下,我们可以将一副Matplotlib图像分成三层结构: 1.第一层是底层的容器层,主要包括Canvas.Figure.Axes: 2.第二层是辅助显示层,主要包括Axis.S ...
- Jmeter响应内容显示乱码问题的解决办法
Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码,原因应该是响应页面没有做编码处理,jmeter默认按照ISO-8859-1编码格式进行解析. 下面把解决步骤列一下: 现象:jmeter ...







