1 条题解
-
0
题目重述
有 个房间排成一排,房间 与房间 之间有一道门(共 道门)。初始所有门都是未锁的(即可通行)。
已知:
- 爱丽丝在区间 中的某个房间();
- 鲍勃在区间 中的某个房间();
- 两人在不同的房间。
我们不知道具体位置,只能通过锁门来阻止他们互相到达(即他们之间至少有一道门是锁上的)。
问:最少需要锁多少道门,才能保证无论他们在各自区间内的哪个房间(只要不同),都无法互相到达?
第一步:转化为区间交集问题
如果两个区间有重叠,那么他们可能出现在重叠部分的不同房间。
如果两个区间不相交,那么他们之间隔着一些房间,但中间的门初始是开的,所以也能互相到达。我们要阻止“任何可能的情况”下他们相遇,就要考虑最坏情况。
定义:
第二步:最坏情况分析
考虑他们可能相遇的最近位置:
- 爱丽丝最靠右的位置是 ;
- 鲍勃最靠左的位置是 。
如果他们之间没有锁门,那么当爱丽丝在 ,鲍勃在 时,他们可以互相到达(如果 ,中间门全开)。
同样,爱丽丝在最左 ,鲍勃在最右 也是危险情况。
因此,我们必须锁上所有可能让“最近的两端”连通的门。
第三步:区间相交的情况
当两个区间有重叠时,设:
$$\text{start} = \max(l_1, l_2),\quad \text{end} = \min(r_1, r_2) $$重叠区间为 ,长度为 。
在重叠区间内部,任何两个相邻的房间都可能被两人分别占据(例如爱丽丝在 ,鲍勃在 )。
因此,重叠区间的每一道门都必须锁上。
这些门位于房间 与 之间、……、房间 与 之间。数量为:
第四步:边界额外锁门
考虑重叠区间的左边界 。
- 如果 ,意味着其中一个区间的左端点更靠左。
- 那么,爱丽丝可能位于 ,鲍勃位于 (即另一个区间的左端)。
- 如果 ,则房间 与 之间的门必须锁上,否则爱丽丝在 (属于 因为 )时能走到鲍勃在 。
- 同理,如果 ,对称情况。
因此,只要 ,就需要额外锁 1 道门(重叠区左外侧的门)。
同理,考虑重叠区右边界 。
- 如果 ,也需要额外锁 1 道门(重叠区右外侧的门)。
第五步:区间不相交的情况
如果两个区间不相交,即 。
例如 与 ,中间隔着房间 及其两边的门。
那么,爱丽丝最右是 ,鲍勃最左是 ,他们之间的门是 和 。
我们只需锁其中 1 道门(比如 )即可阻止所有情况,因为无论他们具体在哪儿,都会经过这道门。因此,不相交时答案 = 。
第六步:公式总结
设:
$$\text{start} = \max(l, L),\quad \text{end} = \min(r, R) $$如果 (相交):
$$\text{ans} = (\text{end} - \text{start}) + [l \neq L] + [r \neq R] $$如果 (不相交):
其中 是艾弗森括号,条件成立时为 ,否则 。
第七步:验证样例
- 与 :,,不相交 ✅
- 与 :,,相交 ✅
- 与 :,,相交 ✅
- 与 :,,相交 ✅
完全符合。
第八步:最终代码(标程)
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int l, r, L, R; cin >> l >> r >> L >> R; int start = max(l, L); int end = min(r, R); int ans; if (start <= end) { ans = (end - start) + (l != L) + (r != R); } else { ans = 1; } cout << ans << "\n"; } return 0; }
复杂度分析
- 每个测试用例 时间。
- 总复杂度 ,,非常快。
- 空间复杂度 。
这样我们就完成了该题的详细题解。
- 1
信息
- ID
- 7221
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者