P3103 [USACO14FEB] Airplane Boarding G

news/2025/1/8 19:17:28/文章来源:https://www.cnblogs.com/LG017/p/18658174

P3103 [USACO14FEB] Airplane Boarding G

想象一下飞机有N个座位,N个座位相当于数轴上的1至N共N个整点,第1个座位在整点1处,第2个座位在整点2处,……第N个座位在整点N处。

有N个奶牛排好队,要登陆坐飞机,第N头奶牛在数轴的整点0处,第N−1头奶牛在数轴的整点−1处,……第1头奶牛在数轴的整点−N+1处。第i头奶牛的座位号是Si。注意:每头奶牛都有唯一的一个座位,不会出现多头奶牛有相同的座位号。

在每一秒钟,奶牛会向右移动一步到达下一个整点,前提是没有奶牛挡住它。 当第i头奶牛到达它的座位Si时,它需要花费Ti秒去把行李放到头顶的行李架上,然后坐到自己的位置上,在此过程中,由于飞机通道很窄,所以在第i头奶牛坐到自己座位之前,在它左边的所有奶牛都不能动,要等奶牛i放好行李坐好后才能动。

现在的问题是,至少要多少秒之后,所有的奶牛都能做到自己的座位上?

\(N \le2*10^5\)

Solution:

妙妙平衡树思维题,感觉可以入选我写过的的十佳题目了。

我们将点 \(i\) 的起点定义为 \(pos_i\)

首先我们很难不想到我们应该按照时间的顺序,也就是输入顺序的倒序来写这题,然后我们仔细思考一下就会发现其实答案由两部分组成:

从起点到终点的距离加上放行李的时间\(s_{i}-pos_{i}+t_{i}\) 和被挡路的时间 \(tim\).

前一半的答案是固定的,所以我们要做的是如何快速的统计一个点总共会被挡多久的路。

那么什么样的点 \(j\) 会挡当前点 \(i\) 的路呢?

首先要满足的肯定是 $pos_i<pos_j $ \(s_i<s_j\)

然后就是 \(\forall k\in[i+1,j] tim_j>tim_k\)

也就是说,如果一个点 \(j\) 出发的比当前点 \(i\) 早且,而且它被挡路的时间 \(tim_j>tim_{max}\) 它才有可能挡住点 \(j\) 及其后序节点(按时间顺序)的路。所以我们要将那些不满足 \(tim_j>tim_i\) 的点全部删除。这样我们就能保证在数据结构内的点全部都是满足有可能挡住 \(i\) 的。然后每个点的到达时间显然就是该数据结构内的最大值\(tim_{max}\) 加上前半部分的时间 \(s_i+pos_i+t_i\).

然后我们发现我们要维护一种数据结构,单点插入,区间删除,查询区间最大值.那就是平衡树了

然后这题就做完了

Code:

#include<bits/stdc++.h>
const int N=2e5+5;
using namespace std;
int rd(){return rand()*17+rand()*rand()+1;}
inline int Max(int x,int y){return x>y ? x : y;}
struct FHQ_Treap{int cnt=0;struct Tree{int ls,rs,x,y,ans,tag,pri;}t[N<<2];int Node(int x,int y){t[++cnt]={0,0,x,y,y,0,rd()};return cnt;}void push(int x,int k){t[x].x-=k;t[x].y+=k,t[x].ans+=k,t[x].tag+=k;}void pushdown(int x){if(!t[x].tag)return;if(t[x].ls)push(t[x].ls,t[x].tag);if(t[x].rs)push(t[x].rs,t[x].tag);t[x].tag=0;}void pushup(int x){if(!x)return;t[x].ans=t[x].y;if(t[x].ls)t[x].ans=Max(t[x].ans,t[t[x].ls].ans);if(t[x].rs)t[x].ans=Max(t[x].ans,t[t[x].rs].ans);return ;}void splite_pos(int x,int &a,int &b,int k){if(!x){a=b=0;return;}pushdown(x);if(k>=t[x].x) {a=x;splite_pos(t[x].rs,t[x].rs,b,k);}if(k<t[x].x){b=x;splite_pos(t[x].ls,a,t[x].ls,k);}pushup(x);}void splite_val(int x,int &a,int &b,int k){if(!x){a=b=0;return;}pushdown(x);if(k>=t[x].y) {a=x;splite_val(t[x].rs,t[x].rs,b,k);}if(k<t[x].y){b=x;splite_val(t[x].ls,a,t[x].ls,k);}pushup(x);}int merge(int x,int y){if(!x||!y)return x|y;pushdown(x);pushdown(y);if(t[x].pri<t[y].pri){t[x].rs=merge(t[x].rs,y);pushup(x);return x;}else{t[y].ls=merge(x,t[y].ls);pushup(y);return y;}}
}T;
int s[N],t[N];
int n,rt,ans=0;
void work()
{ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;rt=T.Node(0,0);for(int i=1;i<=n;i++){cin>>s[i]>>t[i];}int a,b,c,tmp;for(int i=n;i;i--){T.splite_pos(rt,a,b,s[i]);tmp=T.t[a].ans+s[i]+t[i];ans=Max(ans,tmp);T.push(a,1);T.splite_val(b,b,c,tmp-s[i]+1);rt=T.merge(a,T.merge(T.Node(s[i],tmp-s[i]+1),c));}cout<<ans;
}
int main()
{//freopen("P3103.in","r",stdin);freopen("P3103.out","w",stdout);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865474.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城市生命线安全管理:数据要素整合与场景应用实践

城市生命线工程是确保城市正常运行和居民安全生活的关键基础设施,涉及供水、排水、燃气、电力等多个方面。随着信息技术的发展,特别是大数据、物联网、人工智能等技术的应用,城市生命线数据要素与场景应用的深度融合成为提升城市治理能力的重要途径。数据要素的重要性城市生…

SqlSugar入门教程:连接,增、删、改、查

原文链接:https://blog.csdn.net/zls365365/article/details/131199132 第一步,自然是新建一个项目,控制台什么都可以。因为我还没想好怎么做一个完整的项目,那暂且用一个控制台举例吧。 下面自然是从NuGet安装sqlsugar了。注意鉴别需要安装的版本,我这里是安装sqlsugarc…

env(safe-area-inset-bottom) 兼容写法

先看下兼容性:可以看到 @supports 兼容性很好,所以使用 @supports 做兼容是个不错的选择。 例:@supports (padding-bottom: env(safe-area-inset-bottom)) or(padding-bottom: constant(safe-area-inset-bottom)) {.your-dom {padding-bottom: constant(safe-area-inset-bot…

工业采集系统-天然气计量仪表费用二次计算

1、在“驱动管理->中间件驱动”中添加NaturalGasCalculation.drive。2、在设备配置中,添加采集设备,假设采集到的天然气费用因子为D1.F1,充值金额因子为D1.F2,要求计算的天然气使用体积因子为D1.F3。3、在“系统功能->中间件”中添加一个天然气费用计算中间件,配置内…

SQL优化有绝招,使用DAS提升工作效率!完成任务可领取保暖手套!

​「使用DAS实现数据库SQL优化」活动上线了! 数据库自治服务(Database Autonomy Service,简称DAS)是一种基于机器学习和专家经验实现数据库自感知、自修复、自优化、自运维及自安全的云服务。数据库自治服务DAS支持自动SQL优化,相比传统的优化方式,能够自动识别问题SQL,…

类关系图

本文描述了面向对象设计中类与类之间的五种关系,并对这五种关系从耦合程度、语义和方向上进行了比较。类关系图

特种作业操作(低压电工)实操考试资料整理

为啥去考 在B站关注城阳电工电路等赛博电工师傅们已经有一段时间了,我很喜欢看这些师傅们解决生活中的、生产上的各种电气问题,2023年春天就想去报名学,但是那时候学业很繁忙,而初证又需要去线下学习一段时间。到2024年11月发现自己这段时间突然有空,就尽快找了一家机构报…

AutoGen入门-让两个AI自行聊天完成任务

AutoGen介绍 AutoGen 是一个开源编程框架,用于构建 AI 代理并促进多个代理之间的合作以解决问题。AutoGen 旨在提供一个易于使用和灵活的框架,以加速代理型 AI 的开发和研究,就像 PyTorch 之于深度学习。它提供了诸如代理之间可以对话、LLM 和工具使用支持、自主和人机协作工…

Centos7 安装redis教程

步骤一:安装gcc依赖检查gcc是否已经安装,命令:gcc -v,出现下图说明已经安装由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装yum install -y gcc步骤二:下载redis安装包 https://download.redis.io/relea…

【编码】如何实现一套自定义网络协议?

前言 下文介绍的自定义协议仅作为学习示例,纯粹是玩具项目,没有实际可用性。无需过度关注和讨论其合理性 进行通信的双方是谁? 常见的模型 客户端-服务器,例如HTTP协议,浏览器<=>Web服务器。 中转站模型,如MQTT协议,应用服务<=>中转站<=>硬件客户端 对…

记录一个使用VsCode来ssh的问题(已经打开了ssh的一个文件夹路径,怎么新开一个文件夹路径)

一、操作 使用快捷键 Ctrl+Shift+P(Windows) 或 Cmd+Shift+P (Mac)打开 命令面板 然后输入: File:Open Folder之后就可以选项新的路径打开了。。。没想到我被这个卡了好久,有点无语。