洛谷P2190 小Z的车厢

小Z面临除夕凌晨的铁路运输挑战,需要计算至少需要多少节车厢才能完成运输任务。通过输入的站数n和订票申请m,需要解决在不确定始发站的情况下如何高效分配车厢。本文介绍了三种解法,包括暴力模拟、险段树和树状数组结合差分的方法,其中树状数组结合差分的方法能在O(mlogn)的时间复杂度内解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

小Z的家乡有一列在环形铁轨上行驶的火车,共停靠 n 个站(1 号站到 n 号站顺时针排列)。

众所周知,春运是一件非常可怕的事情。不幸的是,小Z是铁路公司的员工,现在他收到了 m 条除夕凌晨的订票申请,每个申请 (x,y,z) 表示有 z 个人要从 x 号站顺时针坐到 y 号站,同时,当火车停靠到x号站时,所有要在x站上车的人都会上车,所有要在x号站下车的人都会下车。

由于始发站不确定,现在小Z想知道至少需要分配给这列火车多少节车厢(每节车厢可容纳 36 人)才能顺利完成该铁路运输,希望你帮帮他。

输入输出格式

输入格式:

 

第一行包含两个整数 n,m。

接下来 m 行,每行包含三个整数 x,y,z。

 

输出格式:

 

第一行包含一个整数,表示至少需要分配给这列火车的车厢数。

 

输入输出样例

输入样例#1:

3 2
1 2 36
2 3 36

输出样例#1:

1

输入样例#2:

4 2
1 2 36
4 3 36

输出样例#2:

2

洛谷说这是一道模拟题,不过我觉得这是在坑人

我想到了三个解法(题解上说的差分我不

### 关于洛谷 P1163 的 Python 解题思路及代码实现 #### 问题描述 题目要求处理一系列车厢编号,目标是按照特定顺序重新排列这些车厢。为了完成这一任务,需要设计算法来模拟这个过程。 #### 数据结构选择 考虑到操作涉及频繁的插入和删除动作,链表是一种合适的选择。然而,在 Python 中更推荐使用双端队列 `collections.deque` 来代替传统意义上的单向或双向链表[^2]。这种数据结构允许高效地执行两端的操作,非常适合解决此类问题。 #### 主要逻辑流程 程序接收一组初始状态下的车厢序列作为输入,并根据指定的目标序列调整当前序列中的元素位置直到两者匹配为止。具体来说: - 初始化两个列表分别存储原始序列与期望得到的结果序列; - 使用字典记录每个数值首次出现的位置以便快速定位; - 循环遍历待排序数组并尝试将其移动到正确的地方; - 输出最终形成的指令集用于指导实际调车作业。 下面是具体的 Python 实现示例: ```python from collections import deque def solve(): n = int(input()) target = list(map(int, input().split())) source = list(range(1, n + 1)) pos_map = {val: idx for idx, val in enumerate(target)} stack = [] result = [] for num in source: while stack and pos_map[num] > pos_map[stack[-1]]: top = stack.pop() if pos_map[top] < pos_map[num]: break result.append('Out') stack.append(num) result.append('In') print("\n".join(result)) solve() ``` 此段代码实现了上述提到的主要功能模块,能够有效地解决问题所提出的挑战。需要注意的是,这段代码假设输入格式严格遵循题目规定的形式;如果存在其他特殊情况,则可能还需要进一步完善异常处理机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值