【补题】Codeforces Global Round 20 D. Cyclic Rotation

题意:偷懒

思路:       D. Cyclic Rotation - Yaqu - 博客园

1.有个观察,如果操作过的序列,一定是连续相同的数字,当然这不代表一定操作过了,由于操作过1次后连续就没有意义,可以假设全都操作过了。

2.考虑从后向前遍历,如果遇到不相同的地方,那么就可以试图将b还原成a的一小部分,当然不能模拟操作,这样一来就变复杂了,因此只需要统计有多少可以还原的操作就可以了,记录操作数字的次数,询问是否能还原,如果可以那么继续,不行那就是NO

3.使用双指针控制,方便写代码

代码:

#include 
#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 a(n + 2);
    std::vector b(n + 2);
    std::vector 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,而且很自信的不适用双指针,一个变量算,感觉有点多此一举了,写不好一点

你可能感兴趣的:(算法)