#模拟
首先,我们将相同的 $c_i$ 存到同一个 [[vector]] 里面,然后处理所有的更改。更改分为必选更改和可选更改($a_i\ne b_i$ 为判定条件)。对于必选更改,我们要在 $b_i$ 对应的 vector 里面找到随便一个元素(一般是最后一个)并删除;对于可选更改,我们只需要找到那个元素就行了。
为什么要找到那个元素呢?因为假如那个元素是第 $j$ 个更改,所有的 $j$ 当中的最大值也就是可以应用到 $a$ 数组当中的最后一个更改。如果这就是 $m$ 个更改当中的最后一个,那么就有解,否则无解。时间复杂度 $\mathcal O((n+m)\log_2 m)$。
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
using namespace std;
const int kMaxN = 2e5 + 5;
int a[kMaxN], b[kMaxN], t, n, m, ch, ans;
map<int, vector<int>> f;
set<int> s;
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
for (cin >> t; t; t--) {
cin >> n, ans = 0, ch = 1;
s.clear(), f.clear();
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
cin >> m;
for (int i = 1, x; i <= m; i++) {
cin >> x;
f[x].push_back(i);
}
for (int i = 1; i <= n; i++) {
if (a[i] == b[i]) {
if (f.count(b[i])) {
ans = max(ans, f[b[i]].back());
}
continue;
}
if (f.count(b[i])) {
ans = max(ans, f[b[i]].back());
f[b[i]].pop_back();
if (f[b[i]].empty()) {
f.erase(b[i]);
}
} else {
ch = 0;
}
}
cout << (ans == m && ch ? "YES" : "NO") << '\n';
}
return 0;
}
```