結果

問題 No.2254 Reverse Only
ユーザー CoCo_Japan_pan
提出日時 2023-03-25 13:56:13
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,284 bytes
コンパイル時間 2,023 ms
コンパイル使用メモリ 199,976 KB
最終ジャッジ日時 2025-02-11 18:03:30
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 40 WA * 7
権限があれば一括ダウンロードができます

ソースコード

diff #

// 提出時にassertはオフ
#ifndef DEBUG
#ifndef NDEBUG
#define NDEBUG
#endif
#endif

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define ALL(x) (x).begin(), (x).end()
template <class T> using vec = vector<T>;

int N, k;

// 多重集合一致判定
bool isSameSet(const vec<int> &A_, const vec<int> &B_) {
    vec<int> A = A_, B = B_;
    if(A.size() != B.size()) {
        return false;
    }
    sort(ALL(A));
    sort(ALL(B));
    for(int i = 0; i < (int)A.size(); i++) {
        if(A[i] != B[i]) return false;
    }
    return true;
}

bool isTotallySame(const vec<int> &A, const vec<int> &B) {
    if(A.size() != B.size()) return false;
    for(int i = 0; i < (int)A.size(); i++) {
        if(A[i] != B[i]) return false;
    }
    return true;
}

bool solve(const vec<int> &A, const vec<int> &B) {
    if(!isSameSet(A, B)) return false;
    int size = A.size();
    if(k > N) {
        return isTotallySame(A, B);
    }
    if(k == N) {
        vec<int> rev_A = A;
        reverse(ALL(rev_A));
        return (isTotallySame(A, B) || isTotallySame(rev_A, B));
    }
    if(k == N - 1) {
        vec<int> sorted_A = A;
        sort(ALL(sorted_A));
        int startIndex = -1;
        for(int i = 0; i < size; i++) {
            if(B[i] == sorted_A[0]) {
                startIndex = i;
                break;
            }
        }
        int nextIndex = (startIndex + 1) % size;
        int prevIndex = (startIndex + size - 1) % size; 
        if(B[nextIndex] == sorted_A[1]) {
            for(int i = 0; i < size; i++) {
                if(B[(startIndex + i) % size] != sorted_A[i]) {
                    return false;
                }
                return true;
            }
        }
        if(B[prevIndex] == sorted_A[1]) {
            for(int i = 0; i < size; i++) {
                if(B[(startIndex + size - i) % size] != sorted_A[i]) {
                    return false;
                }
                return true;
            }
        }
        return false;
    }
    // k <= N - 2
    return true;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> N >> k;
    vec<int> A(N), B(N);
    for(int &a : A) cin >> a;
    for(int &b : B) cin >> b;
    cout << (solve(A, B) ? "Yes" : "No") << "\n";
}
0