- 1400分的题,难度不大。不过遗憾的是比赛的时候没有想到将栈中礼物作为下标,深度作为值的方法,而是用了结构体+二分。
C o d e Code Code
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 1e5 + 10;
int n, m;
int a[N], b[N];
// a[i] = j: 栈中礼物i的深度是j
// b[i] = j: 要送的第i件礼物是j
void solve() {
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
int x; cin >> x;
a[x] = i;
}
for (int i = 1; i <= m; i ++) {
cin >> b[i];
}
int res = 0;
int deep = 0; // 记录已经送过的礼物中在栈中最深的深度
int gave_num = 0; // 已经送出的礼物数量
for (int i = 1; i <= m; i ++) {
int now_deep = a[b[i]];
if (now_deep > deep) { // 当前要送的礼物深度更深
res += 1 + (now_deep - 1 - gave_num) * 2;
// now_deep - 1 - gave_num表示
// 栈中有多少礼物在当前要送的礼物的上边(深度更小)
deep = max(deep, now_deep); // 更新深度
} else {
res ++;
}
gave_num ++;
}
cout << " ";
cout << res << "\n";
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
cin >> T; cin.get();
while (T --) solve();
return 0;
}
- 附比赛时候的代码:
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 1e5 + 10;
int n, m;
int a[N], b[N];
struct ppp{
int a, id_stk;
bool friend operator < (ppp x, ppp y) {
return x.a < y.a;
}
}c[N];
void solve() {
cin >> n >> m;
// 栈中的礼物顺序
for (int i = 1; i <= n; i ++) {
cin >> a[i];
c[i] = {a[i], i};
}
sort(c + 1, c + n + 1);
// 要送的礼物顺序
for (int i = 1; i <= m; i ++) {
cin >> b[i];
}
int res = 0;
int deep = 0;
int throw_ed = 0;
for (int i = 1; i <= m; i ++) {
int l = 1, r = n;
while (l < r) {
int mid = (l + r + 1) / 2;
if (c[mid].a > b[i]) {
r = mid - 1;
} else {
l = mid;
}
}
int now_deep = c[l].id_stk;
if (now_deep > deep) {
res += 1 + (now_deep - 1 - throw_ed) * 2;
deep = max(deep, now_deep);
} else {
res ++;
}
throw_ed ++;
}
cout << " ";
cout << res << "\n";
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
cin >> T; cin.get();
while (T --) solve();
return 0;
}