1 条题解
-
0
- 平衡隧道
这个问题可以通过多种方法解决,以下是其中一种。
假设汽车在时间点 离开隧道,并设 为汽车 离开隧道的时间。
例如,在第一个示例中,我们有 和 。那么 :汽车 第一个进入并在时间 离开,所以 ;汽车 第二个进入并在时间 离开,所以 ;依此类推。
注意 是一个排列,它不仅可以在 时间内找到,而且对我们非常有用。结果表明,我们可以使用 轻松判断汽车 是否必须被罚款。
具体来说,如果 小于 ,则汽车 必须被罚款。
为什么呢?回顾一下:如果存在一辆更早进入隧道并且更晚离开隧道的汽车,那么汽车 就必须被罚款。如果有一辆车更早进入隧道,那它一定是某个 且 。如果它更晚离开隧道,则必须满足 。
因此,现在我们只需从左到右遍历,维护 的最大值,并将其与 进行比较。总复杂度为 。
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<int> a(n), b(n); for (int i = 0; i < n; i++) { cin >> a[i]; --a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; --b[i]; } vector<int> pos(n); for (int i = 0; i < n; i++) { pos[b[i]] = i; } vector<int> c(n); for (int i = 0; i < n; i++) { c[i] = pos[a[i]]; } int mx = -1, ans = 0; for (int i = 0; i < n; i++) { if (c[i] > mx) { mx = c[i]; } else { ++ans; } } cout << ans << '\n'; return 0; }
- 1
信息
- ID
- 6974
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者