CSES - Datatähti Open 2021 - Results
Submission details
Task:Sorting
Sender:vishesh312
Submission time:2021-01-31 22:22:14 +0200
Language:C++ (C++17)
Status:READY
Result:36
Feedback
groupverdictscore
#1ACCEPTED36
#20
Test results
testverdicttimegroup
#1ACCEPTED0.43 s1, 2details
#20.43 s2details
#3ACCEPTED0.44 s1, 2details
#4ACCEPTED0.45 s1, 2details

Code

#include "bits/stdc++.h"
using namespace std;
/*
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using ordered_set = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;
*/

#define all(x) begin(x), end(x)
#define sz(x) (int)x.size()

typedef long long ll;
const int mod = 1e9+7;
map<vector<int>, bool> vis;
map<vector<int>, int> con;
vector<vector<bool>> can_sort(9, vector<bool>(44444));
int cc = 0;

void bfs(vector<int> v) {
    int n = sz(v);
    vis[v] = true;
    queue<vector<int>> q;
    q.push(v);
    bool srt = false;
    while (!q.empty()) {
        auto a = q.front();
        con[a] = cc;
        q.pop();
        if (is_sorted(all(a))) {
            srt = true;
        }
        for (int first_index = 0; first_index < n-1; ++first_index) {
            for (int second_index = first_index+2; second_index < n-1; ++second_index) {
                auto temp = a;
                swap(temp[first_index], temp[second_index]);
                swap(temp[first_index+1], temp[second_index+1]);
                if (!vis[temp]) {
                    vis[temp] = true;
                    q.push(temp);
                }
            }
        }
    }
    if (srt) {
        can_sort[n][cc] = true;
    }
}

void precompute(int n) {
    cc = 0;
    vector<int> v;
    for (int i = 1; i <= n; ++i) v.push_back(i);
    do {
        if (!vis[v]) {
            bfs(v);
            ++cc;
        }
    } while(next_permutation(all(v)));
}

void solve(int tc) {
    int n;
    cin >> n;
    vector<int> v(n);
    for (auto &x : v) cin >> x;
    cout << (can_sort[n][con[v]] ? "YES\n" : "NO\n");
}

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int tc = 1;
    cin >> tc;
    for (int i = 1; i <= 8; ++i) precompute(i);
    for (int i = 1; i <= tc; ++i) solve(i);
    return 0;
}

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
...
Truncated

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)

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
...
Truncated

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
...
Truncated