#P3016. 最小区间
最小区间
最小区间
题目描述
给定 k 个整数列表,每个列表内部的元素都已经按非递减顺序排好序。
请你找到一个最短的区间 [a, b](a ≤ b),使得这个区间内至少包含每个列表中的一个元素。
如果有多个长度相同的区间,选择左端点 a 最小的那个。
请输出这个区间的左右端点。
输入格式
第一行一个正整数 k,表示列表的个数。
接下来 k 行,每行第一个整数 m 表示该列表的长度,随后 m 个整数为该列表的元素(保证非递减)。
输出格式
一行两个整数 a 和 b,表示最短区间的左右端点。
样例
3
5 4 10 15 24 26
4 0 9 12 20
4 5 18 22 30
20 24
1
1 1
1 1
3
2 1 2
2 10 11
2 20 21
2 20
样例解释
- 样例 1:区间 [20, 24] 长度 4,覆盖了第一个列表的 24、第二个列表的 20、第三个列表的 22,是最短区间。
- 样例 2:只有一个列表,包含 1 的任意最短区间为 [1, 1]。
- 样例 3:三个列表分别为 {1,2}、{10,11}、{20,21},区间 [2, 20](长度 18)覆盖了 2、10(或 11)、20,是最短区间。
数据范围
- 1 ≤ k ≤ 100
- 每个列表长度 1 ≤ m ≤ 20
- 总元素个数 ≤ 2000
- -10^5 ≤ 元素值 ≤ 10^5
提示
把每个列表中的元素连同其所属列表编号合并成一个数组,按值排序,然后用滑动窗口维护当前窗口覆盖了哪些列表(记录每个列表在窗口内出现的次数)。当窗口覆盖全部 k 个列表时,用窗口两端元素值之差更新答案;不断收缩左端点,直到不再覆盖全部列表。时间复杂度 O(N log N),N 为总元素个数。