#19287. 穿越海峡

穿越海峡

你好!我是你的OI金牌教练。

在前面的课程中,我们已经涉及了秦、汉、隋唐、宋、明(长城)等历史时期。今天,我们继续停留在明朝,把目光投向波澜壮阔的大航海时代,结合**“郑和下西洋”**的历史背景,讲解一类非常经典的算法问题——区间合并 (Interval Merging)

这道题目符合 GESP 6级 难度,重点考察结构体排序贪心思维


第一部分:背景知识讲解

1. 郑和下西洋 (Zheng He's Voyages)

明成祖永乐年间(1405年-1433年),为了宣扬国威、加强与海外各国的联系,三宝太监郑和率领庞大的船队七次下西洋。

  • 规模:郑和船队规模空前,拥有巨大的“宝船”,随行人员多达两万余人。
  • 航线:从苏州刘家港出发,经东南亚、印度洋,最远到达红海沿岸和非洲东海岸。

2. 海峡通行与船队调度

在航行过程中,船队经常需要穿越狭窄的海峡(如马六甲海峡)。海峡的水文条件复杂,可能只有特定的时间段或特定的航道适合通行。 为了保证安全,船队中的各分队需要规划好通过海峡的时间。如果两支分队的计划通行时间有重叠,它们就必须合并成一个更大的编队依次通过(或者视为一段连续的繁忙时间),以避免调度混乱。

3. 算法模型:区间合并

我们将时间看作数轴。每支分队的通行计划是一个区间 [L,R][L, R]

  • 如果有两个区间 [1,5][1, 5][3,8][3, 8],它们有重叠部分,实际上这段时间海峡一直是繁忙的,繁忙时间段合并为 [1,8][1, 8]
  • 如果有两个区间 [1,5][1, 5][6,10][6, 10],它们虽然不重叠,但在时刻 5-6 之间可能有空隙(视题目定义,如果是离散时刻通常不合并,如果是连续时间轴且端点重合则合并)。
  • 我们的目标是将杂乱的、可能有重叠的时间段,整理成若干个互不重叠的“连续通行时段”。

第二部分:题目内容

题目名称:穿越海峡 (Crossing the Strait)

题目描述

郑和的船队即将通过一处险要的海峡。船队共有 NN 支分队,编号为 11NN。 根据水文观测,第 ii 支分队计划在时刻 LiL_i 开始进入海峡,并在时刻 RiR_i 驶离海峡(包含端点 LiL_iRiR_i)。

为了确保指挥统一,郑和命令:如果两支分队的计划通行时间有重叠(哪怕只是端点重合,例如一支在时刻 5 结束,另一支在时刻 5 开始),它们就必须归入同一个“护航编队”进行统一调度。这个合并过程具有传递性(即 A 和 B 重叠,B 和 C 重叠,则 A、B、C 都在同一个编队)。

经过这样的合并整理后,所有分队会被划分成若干个独立的“护航编队”,每个编队占用一段连续的通行时间。

请你编写程序计算:

  1. 最终形成了多少个独立的护航编队(即合并后的区间个数)?
  2. 在这些编队中,持续时长最长的一个编队占用了多长时间?(时长定义为 RendLstartR_{end} - L_{start})。

输入格式

第一行包含一个正整数 NN,表示分队的数量。

接下来 NN 行,每行包含两个正整数 Li,RiL_i, R_i,表示第 ii 支分队的计划通行开始时刻和结束时刻。

输出格式

输出一行,包含两个整数,中间用空格隔开。 第一个整数表示独立的护航编队数量。 第二个整数表示最长的通行时长。

输入输出样例 #1

输入:

4
1 3
2 6
8 10
15 18

输出:

3 5

样例 #1 解释:

  • 分队1: [1,3][1, 3]
  • 分队2: [2,6][2, 6]。与分队1重叠(2 < 3),合并为 [1,6][1, 6]
  • 分队3: [8,10][8, 10]。与 [1,6][1, 6] 不重叠。这是一个新的编队。
  • 分队4: [15,18][15, 18]。与 [8,10][8, 10] 不重叠。这是一个新的编队。
  • 最终有 3 个编队:[1,6],[8,10],[15,18][1, 6], [8, 10], [15, 18]
  • 时长分别是:61=56-1=5, 108=210-8=2, 1815=318-15=3
  • 最长时长为 5。

输入输出样例 #2

输入:

5
2 4
4 8
10 12
1 3
15 20

输出:

3 7

样例 #2 解释: 区间分别是:[2,4], [4,8], [10,12], [1,3], [15,20]注意:输入是乱序的!必须先排序! 排序后:

  1. [1, 3]
  2. [2, 4] -> 与上一个重叠,合并为 [1, 4]
  3. [4, 8] -> 与上一个重叠(端点4重合),合并为 [1, 8]
  4. [10, 12] -> 不重叠,新编队。
  5. [15, 20] -> 不重叠,新编队。

结果:

  • 编队1: [1, 8],时长 81=78-1=7
  • 编队2: [10, 12],时长 1210=212-10=2
  • 编队3: [15, 20],时长 2015=520-15=5
  • 数量:3,最长时长:7。

数据范围

对于 100%100\% 的数据:

  • 1N1051 \le N \le 10^5
  • 1Li<Ri1091 \le L_i < R_i \le 10^9
  • 时间限制:1.0 秒