USACO08FEB Hotel G

2023-12-29 01:12
文章标签 hotel usaco08feb

本文主要是介绍USACO08FEB Hotel G,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

分析

可以用线段树维护区间内连续的空房的最长长度,但转念一想,连续的空房可以横跨左孩子管辖的区间和右孩子管辖的区间,所以还得维护从区间开头开始的最长连续空房,和从区间结尾开始的最长连续空房,更新节点信息的代码:

void push_up(int cur, int l, int r){int mid = (l + r) / 2;tree[cur].ls = tree[cur * 2].ls;//从区间开头开始的最长连续空房为他左孩子的答案if(tree[cur * 2].ls == mid - l + 1){//如果他左孩子的答案是整个区间则还可以跟右孩子的答案拼一起tree[cur].ls = tree[cur * 2].ls + tree[cur * 2 + 1].ls; } tree[cur].rs = tree[cur * 2 + 1].rs;//同理if(tree[cur * 2 + 1].rs == r - mid){tree[cur].rs = tree[cur * 2].rs + tree[cur * 2 + 1].rs;}tree[cur].ans = max(tree[cur * 2].ans, tree[cur * 2 + 1].ans);//连续的空房的最长长度为左孩子的答案和右孩子的答案的最大值tree[cur].ans = max(tree[cur].ans, tree[cur * 2].rs + tree[cur * 2 + 1].ls);//左孩子从结尾开始的空房还可以跟右孩子从开头开始的空房拼一起
}

而查询时如果左边的区间满足答案,则返回左边的,如果中间的满足答案,则返回中间的,否则返回后面的。

int query(int cur, int l, int r, int val){if(l == r){//找到答案return l;}push_down(cur, l, r);//懒标记下传int mid = (l + r) / 2;if(tree[cur * 2].ans >= val){return query(cur * 2, l, mid, val);}if(tree[cur * 2].rs + tree[cur * 2 + 1].ls >= val){return mid - tree[cur * 2].rs + 1;}return query(cur * 2 + 1, mid + 1, r, val);
}

修改、标记下传、和建树都很简单,代码如下:

void push_down(int cur, int l, int r){if(!tag[cur]){//没标记不下传return ;}if(tag[cur] == 1){//l到r全住人tag[cur * 2] = tag[cur * 2 + 1] = 1;tree[cur * 2].ans = tree[cur * 2].ls = tree[cur * 2].rs = 0;tree[cur * 2 + 1].ans = tree[cur * 2 + 1].ls = tree[cur * 2 + 1].rs = 0;}else{//l到r退房int mid = (l + r) / 2;tag[cur * 2] = tag[cur * 2 + 1] = 2;tree[cur * 2].ans = tree[cur * 2].ls = tree[cur * 2].rs = mid - l + 1;tree[cur * 2 + 1].ans = tree[cur * 2 + 1].ls = tree[cur * 2 + 1].rs = r - mid;}tag[cur] = 0;
}
void build(int cur, int l, int r){if(l == r){tree[cur].ans = tree[cur].ls = tree[cur].rs = 1;return ;}int mid = (l + r) / 2;build(cur * 2, l, mid);build(cur * 2 + 1, mid + 1, r);push_up(cur, l, r);
}
void update(int cur, int l, int r, int qx, int qy, int val){if(qx > r || qy < l){//当前区间完全不包含return ;}if(qx <= l && r <= qy){//完全包含tag[cur] = val;if(val == 1){tree[cur].ans = tree[cur].ls = tree[cur].rs = 0; }else if(val == 2){tree[cur].ans = tree[cur].ls = tree[cur].rs = r - l + 1;}return ;}push_down(cur, l, r);int mid = (l + r) / 2;//只包含一部分就继续递归update(cur * 2, l, mid, qx, qy, val);update(cur * 2 + 1, mid + 1, r, qx, qy, val);push_up(cur, l, r);
}

主函数:

int main(){cin >> n >> m;build(1, 1, n);while(m --){int Type, x, y;cin >> Type;if(Type == 1){cin >> x;if(tree[1].ans >= x){int now = query(1, 1, n, x);cout << now << "\n";update(1, 1, n, now, now + x - 1, 1);}else{//如果1到n的区间都不满足答案就无解cout << "0\n";}}else{cin >> x >> y;update(1, 1, n, x, x + y - 1, 2);}}return 0;
}

完整代码自己拼接吧……

这篇关于USACO08FEB Hotel G的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/547904

相关文章

hdu 2992 Hotel booking(spfa+floyd+map)

http://acm.hdu.edu.cn/showproblem.php?pid=2992 题意:运输公司要从初始城市运送货物到目的城市,共有n个城市,编号是1~n。出发点和目的地分别是1和n号城市。在这些城市中有h个免费客栈,司机一天最多能走10小时,晚上选择一个客栈休息。给出h个客栈所在的城市以及m个城市的连接情况,问最少需要的客栈数。 思路:把h个客栈看做点,编号为1~h,起点标

【ITOO项目中遇到的问题】——为 MT_HOTEL_SERVICE 添加持久化单元服务失败

一、背景介绍  项目框架采用的是EJB3.0,使用的JBossEap6.2服务器进行部署。 二、遇到的问题 为MT_HOTEL_SERVICE 添加持久化单元服务失败。         三、错误日志          08:56:58,701 ERROR [org.jboss.msc.servi

Hotel ----线段树并查集,区间合并

Hotel Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 11223 Accepted: 4855 Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment

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

题目链接~~> 做题感悟:这题是接触线段树区间合并的第一题,做的很纠结。 解题思路:                 注意线段树上节点代表的信息 : 每个节点需要维护 lc , rc , mc ,add ,见下图: add 为懒惰标记。假设 i 代表父亲节点编号,左儿子为  i * 2  ,右儿子为 i * 2  + 1 ,那么我们可以得到 : T [ i ] .lc 首先加上左儿

bzoj1593[Usaco2008 Feb]Hotel旅馆

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1593 题目大意: 有一家著名旅馆,这家旅馆一共有N 间客房,都在同一楼层,一字顺序排开。旅店前台的工作是忙碌的,他们需要处理订房请求和退房请求。有订房请求的游客会要求预定一 段连续的房间。如果能够满足客户的要求,前台总会尽量满足,如果有多处连续的空房可供预定,前台会挑选编号最靠前的优先

ES与关系数据库的同步练习(hotel_admin)

目录 1 es与数据库同步的方法2 实践2.1 任务介绍2.2 MQ方面操作2.2.1 声明交换机队列并且绑定2.2.2 hotel_admin端web层设置mq发送消息2.3 hotel_demo端监听接受消息并执行es操作 1 es与数据库同步的方法 方式一:同步调用 优点:实现简单,粗暴缺点:业务耦合度高 方式二:异步通知(选择这个折中下) 优点:低耦合,实现难度

【kaggle】Expedia Hotel Recommendations

metrics是MAP@5,mean average precision Expedia Hotel Recommendations 文章目录 1. Leakage solution2. most popular solution 1. Leakage solution kaggle 入门系列翻译(二) Expedia Leakage solution 2. most p

poj 3667 Hotel(线段树区间更新)

题目:http://poj.org/problem?id=3667 大意:有N个房间,给出M条语句,“1  a”表示要求查询是否存在连续的a个空的房间,有的话输出最左边的一个,没有的话输出0。“2 a b"表示把从a开始的b个房间清空。 Sample Input 10 61 31 31 31 32 5 51 6 Sample Output 14705 区间更新,区

[POI2014]Hotel加强版

Hotel加强版 题解 很板子的一道长链剖分。 首先应该是很容易想出它的dp方程式的。 我们令 f u , i f_{u,i} fu,i​表示在 u u u的子树中,与 u u u距离为 j j j的点的个数, g u , i g_{u,i} gu,i​表示在 u u u的子树中,两个离它们 l c a lca lca距离与它们的 l c a lca lca与 u u u距离的差值为 j j

kaggle——Hotel booking demand酒店预订需求

1.导入数据 import numpy as npimport pandas as pdimport seaborn as sns# 读取csv文件hotel_data = pd.read_csv(r'D:\4_Project\1_pycharm_project\Hotel_booking_demand\hotel_bookings.csv')# 查看前5行数据hotel_data.h