#P3038. Flying Right
Flying Right
题目描述
Farmer John 的奶牛们认为人类做得并不好,于是决定自己创办一家航空公司。它们的目标客户是居住在密歇根湖西岸的奶牛。每天早晨,飞机从最北端的农场向南飞往 Chicowgo,沿途停靠多个站点;傍晚则从南端飞回北端。
你需要帮助它们决定每天运送的乘客。海岸线上有编号为 1 到 N(1 ≤ N ≤ 10,000)的农场(1 为最北端,N 为最南端)。当天共有 K(1 ≤ K ≤ 50,000)组奶牛希望旅行,每组奶牛从起点农场 S 到终点农场 E(S ≠ E)。飞机容量为 C(1 ≤ C ≤ 100)。部分搭载是允许的,但一旦登机,奶牛必须到达目的地才能下机。
求在满足容量限制的前提下,早晚航班最多能运送的奶牛总数。
输入格式
- 第 1 行:三个整数 K, N, C
- 第 2 至 K+1 行:每组旅行的三个整数 S, E, M(M 为该组奶牛数量)
输出格式
- 第 1 行:早晚航班运送的奶牛总数最大值
输入样例
4 8 3
1 3 2
2 8 3
4 7 1
8 3 2
输出样例
6
提示
- 输入解释:4 组奶牛,8 个农场,飞机容量为 3。
- 输出解释:早晨运送 2(1→3) + 1(2→8) + 1(4→7),傍晚运送 2(8→3),总计 6。
题解思路
将问题分为南向(早晨)和北向(傍晚)两个独立部分处理:
-
南向航班(S < E):
- 将每组请求的区间视为
[S, E)
,按终点升序排序。 - 使用线段树维护区间最大值,贪心分配座位。
- 将每组请求的区间视为
-
北向航班(S > E):
- 将每组请求的区间视为
[E, S)
,按终点升序排序。 - 同样使用线段树维护区间最大值,贪心分配座位。
- 将每组请求的区间视为
线段树操作:
- 区间最大值查询:确定当前区间的最大占用座位数。
- 区间加法更新:分配座位后更新区间占用。
最终结果为南向与北向运送量之和。
关键点:按终点排序确保后续请求不影响已处理请求的座位分配,线段树高效维护区间操作。