- 对于每个a[i] 找第一个大于它的b[j]
- 用桶找
- 亦可线段树
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 2e5 + 7;
const int mod = 1e9 + 7;
signed main() {
int T;
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> T;
while (T--) {
int n;
cin >> n;
unordered_map<int, int> p, q;
for (int i = 0, x; i < n; ++i) cin >> x, p[x] = i;
for (int i = 0, x; i < n; ++i) cin >> x, q[x] = i;
// 对于每个a[i] 第一个大于它的b[j]
vector<int> f(n, n);
int last = n;
for (int i = n * 2; i; i -= 2) {
int &ori = f[p[i - 1]];
int &pos = q[i];
ori = min(ori, pos);
ori = min(ori, last);
last = ori;
}
// 统计答案
int ans = n * 2;
for (int i = 0; i < n; ++i) ans = min(ans, i + f[i]);
cout << ans << '\n';
}
return 0;
} 如果题目没有限制数据范围,就需要sort+二分或者set二分确定最右小值是谁

京公网安备 11010502036488号