1 条题解
-
0
【例77.2】经验值
解题思路
用left[value]、right[value]保存排列中某值的当前相邻值,边界用0哨兵。删x时把左右值加入经验,再将左右节点互相连接,常数时间移除。
正确性说明
依照上述推导,逐步维护已处理部分的有效状态。每一步都完成当前项的贡献且不改变已确定的次序,结束时输出的状态恰好对应题目要求。
易错点
删除的是数值不是位置;边界缺邻贡献0;总经验用long long。
复杂度
时间O(n),空间O(n)。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> p(n + 2), L(n + 1), R(n + 1); for (int i = 1; i <= n; i++) cin >> p[i]; for (int i = 1; i <= n; i++) { L[p[i]] = p[i - 1]; R[p[i]] = p[i + 1]; } long long ans = 0; for (int i = 0; i < n; i++) { int x; cin >> x; ans += L[x] + R[x]; if (L[x]) R[L[x]] = R[x]; if (R[x]) L[R[x]] = L[x]; } cout << ans << "\n"; return 0; }
- 1