【补题】Codeforces Global Round 20 D. Cyclic Rotation
题意:偷懒
思路: D. Cyclic Rotation - Yaqu - 博客园
1.有个观察,如果操作过的序列,一定是连续相同的数字,当然这不代表一定操作过了,由于操作过1次后连续就没有意义,可以假设全都操作过了。
2.考虑从后向前遍历,如果遇到不相同的地方,那么就可以试图将b还原成a的一小部分,当然不能模拟操作,这样一来就变复杂了,因此只需要统计有多少可以还原的操作就可以了,记录操作数字的次数,询问是否能还原,如果可以那么继续,不行那就是NO
3.使用双指针控制,方便写代码
代码:
#include <bits/stdc++.h>
#define int long long
#define int128 __int128
#define IOS \std::ios::sync_with_stdio(0); \std::cin.tie(0); \std::cout.tie(0);
const int N = 1e6 + 10;
const int INF = 1e18;
const int MOD = 998244353;void solve() {int n;std::cin >> n;std::vector<int> a(n + 2);std::vector<int> b(n + 2);std::vector<int> cnt(n + 2, 0);for(int i = 1; i <= n; i++) {std::cin >> a[i];}for(int i = 1; i <= n; i++) {std::cin >> b[i];}for(int i = n, j = n; j > 0;) {while(b[j - 1] == b[j]) {cnt[b[j]]++;j--;continue;}if(a[i] == b[j]) {i--;j--;} else if(cnt[a[i]]) {cnt[a[i]]--;i--;} else {std::cout << "NO\n";return;}}std::cout << "YES\n";
}signed main() {IOS;int t = 1;std::cin >> t;while(t--) {solve();}
}
自己写的时候默认了操作顺序一定是先进后出的栈,狠狠WA,而且很自信的不适用双指针,一个变量算,感觉有点多此一举了,写不好一点