CSES - Datatähti Open 2021 - Results
Submission details
Task:Sorting
Sender:qpwoeirut
Submission time:2021-01-30 09:43:17 +0200
Language:C++17
Status:READY
Result:36
Feedback
groupverdictscore
#1ACCEPTED36
#20
Test results
testverdicttimegroup
#1ACCEPTED0.01 s1, 2details
#20.01 s2details
#3ACCEPTED0.01 s1, 2details
#4ACCEPTED0.08 s1, 2details

Code

//sorting.cpp created at 01/29/21 21:00:48

#include <bits/stdc++.h>

using namespace std;

const int MN = 101;

int N;
int A[MN], B[MN];

void solve() {

}

int pack() {
    int ret = 0;
    for (int i=0; i<=N; ++i) {
        ret <<= 3;
        ret |= B[i];
    }
    assert(ret < (1 << 27));
    return ret;
}

void unpack(int ret) {
    for (int i=N; i>=0; --i) {
        B[i] = ret & 7;
        ret >>= 3;
    }
    assert(B[N] == N-1);
}

short seen[1 << 27];
bool ans[1001];
bool brute(const int test) {
    assert(N <= 8);
    copy(A, A+N, B);

    for (int i=0; i<N; ++i) {
        --B[i];
    }
    B[N] = N-1;

    const int start = pack();
    if (seen[start] > 0) {
        ans[test] = ans[seen[start]];
        return ans[seen[start]];
    }
    
    for (int i=0; i<N; ++i) {
        B[i] = i;
    }
    const int tar = pack();

    queue<int> q;
    q.push(start);
    seen[start] = test;
    while (q.size() > 0) {
        const int cur = q.front(); q.pop();
        
        if (cur == tar) {
            ans[test] = true;
            return true;
        }

        for (int i=0; i+1<N; ++i) {
            for (int j=i+2; j+1<N; ++j) {
                unpack(cur);
                
                swap(B[i], B[j]);
                swap(B[i+1], B[j+1]);
                const int nxt = pack();
                if (seen[nxt] < test) {
                    if (seen[nxt] > 0) {
                        ans[test] = ans[seen[nxt]];
                        return ans[seen[nxt]];
                    }
                    seen[nxt] = test;
                    q.push(nxt);
                }
            }
        }
    }
    ans[test] = false;
    return false;
}

int main() {
    //N = 8;
    //for (int i=0; i<8; ++i) {
    //    B[i] = 7 - i;
    //}
    //B[8] = 7;
    //cout << pack() << endl;
    cin.tie(0)->sync_with_stdio(0);
    int T;
    cin >> T;
    for (int t=1; t<=T; ++t) {
        cin >> N;
        for (int i=0; i<N; ++i) {
            cin >> A[i];
        }
        cout << (brute(t) ? "YES\n" : "NO\n");
    }
}

Test details

Test 1

Group: 1, 2

Verdict: ACCEPTED

input
153
1
1
2
1 2
...

correct output
YES
YES
NO
NO
NO
...

user output
YES
YES
NO
NO
NO
...

Test 2

Group: 2

Verdict:

input
1000
59
35 29 32 50 11 15 9 21 19 45 2...

correct output
YES
NO
YES
NO
YES
...

user output
(empty)

Error:
code: input/code.cpp:37: bool brute(int): Assertion `N <= 8' failed.

Test 3

Group: 1, 2

Verdict: ACCEPTED

input
720
6
1 6 4 5 2 3
6
6 3 2 1 5 4
...

correct output
YES
NO
NO
NO
YES
...

user output
YES
NO
NO
NO
YES
...

Test 4

Group: 1, 2

Verdict: ACCEPTED

input
1000
8
7 4 2 8 6 3 5 1
8
3 8 2 7 5 4 6 1
...

correct output
NO
NO
YES
NO
YES
...

user output
NO
NO
YES
NO
YES
...