はまやんはまやんはまやん

hamayanhamayan's blog

0 or 1 Swap [AtCoder Beginner Contest 135 B]

https://atcoder.jp/contests/abc135/tasks/abc135_b

解説

https://atcoder.jp/contests/abc135/submissions/6588394

入れ替え操作は全部でO(N2)なので、全通り試すことはできそう。
昇順になっているかの判定もO(N)でできるので、全部でO(N3)で間に合う。
C++にはswap関数があるので、これで要素をswapしよう。

int N, P[50], Q[50];
//---------------------------------------------------------------------------------------------------
bool check(int* v) {
    rep(i, 0, N) if (v[i] != i + 1) return false;
    return true;
}
//---------------------------------------------------------------------------------------------------
#define yes "YES"
#define no "NO"
string solve() {
    if (check(P)) return yes;

    rep(i, 0, N) rep(j, i + 1, N) {
        rep(k, 0, N) Q[k] = P[k];
        swap(Q[i], Q[j]);
        if (check(Q)) return yes;
    }

    return no;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 0, N) cin >> P[i];
    cout << solve() << endl;
}