CSES - Datatähti Open 2021 - Results
Submission details
Task:Sorting
Sender:nigus
Submission time:2021-01-30 15:37:34 +0200
Language:C++17
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED36
#2ACCEPTED64
Test results
testverdicttimegroup
#1ACCEPTED0.12 s1, 2details
#2ACCEPTED0.13 s2details
#3ACCEPTED0.13 s1, 2details
#4ACCEPTED0.13 s1, 2details

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:120:10: warning: unused variable 'b' [-Wunused-variable]
     ll a,b,c,d;
          ^
input/code.cpp:120:12: warning: unused variable 'c' [-Wunused-variable]
     ll a,b,c,d;
            ^
input/code.cpp:120:14: warning: unused variable 'd' [-Wunused-variable]
     ll a,b,c,d;
              ^

Code

#pragma GCC optimize("O3")   //
#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define per(i, b, a) for(int i = b - 1; i >= a; i--)
#define trav(a, x) for(auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef long double ld;
typedef unsigned long long ull;

unsigned seed = chrono::system_clock::now().time_since_epoch().count();
mt19937 eng(seed);

ll random2(){
    return (1ll << 31ll)*eng()+eng();
}

ll n,m,k,q,T;

const ll big = 1000000007;
const ll big2 = 1000000009;
const ll mod =  998244353;

const int MAXN = 400002;

vi A;

void answer(bool ans){
    if(ans){
        cout << "YES\n";
    }
    else{
        cout << "NO\n";
    }
}

set<ll> S;

ll has(vi &P){
    ll h = sz(P);
    trav(a, P){
        h *= 101;
        h += a+1;
    }
    return h;
}

int inv(vi &V){
    int ans = 0;
    rep(c1,0,sz(V)){
        rep(c2,0,c1){
            if(V[c2] > V[c1])ans++;
        }
    }
    return ans;
}

ll F[123] = {0};

void bfs(int k){
    queue<vi> Q;
    vi temp;
    rep(c1,0,k){
        temp.push_back(c1);
    }
    Q.push(temp);
    while(!Q.empty()){
        vi V = Q.front();
        Q.pop();
        ll h = has(V);
        if(S.find(h) != S.end())continue;
        S.insert(h);
        F[k]++;

        /*
        if(k == 5){
            rep(c3,0,k){
                cerr << V[c3]+1 << " ";
            }cerr << inv(V)%2 << "  hh\n";
        }
        */

        vi temp2;
        rep(c1,0,k){
            temp2.push_back(V[c1]);
        }
        rep(c1,0,k-3){

            rep(c2,c1+2,k-1){
                swap(temp2[c1], temp2[c2]);
                swap(temp2[c1+1], temp2[c2+1]);
                ll h2 = has(temp2);

                if(S.find(h2) == S.end()){
                    Q.push(temp2);
                }
                swap(temp2[c1], temp2[c2]);
                swap(temp2[c1+1], temp2[c2+1]);
            }

        }
    }

}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    //freopen("fhc.txt","r",stdin);
    //freopen("autput.txt","w",stdout);

    ll a,b,c,d;

    const int lim = 8;

    rep(c1,4,lim+1){
        bfs(c1);
        cerr << c1 << ": " << F[c1] << "\n";
    }

    cin >> T;

    rep(c4,0,T){

        cin >> n;
        A.clear();
        int invs = 0;

        rep(c1,0,n){
            cin >> a;
            a--;
            A.push_back(a);
            rep(c2,0,c1){
                if(A[c2] > a)invs++;
            }
        }

        if(n <= 3){
            answer((invs == 0));
            continue;
        }

        if(n >= 4){
            if(n <= lim){
                ll h = has(A);
                if(S.find(h) == S.end()){
                    answer(0);
                }
                else{
                    answer(1);
                }
                continue;
            }
            answer((1+invs)%2);

        }

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

Error:
4: 2
5: 60
6: 360
7: 2520
8: 20160

Test 2

Group: 2

Verdict: ACCEPTED

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

correct output
YES
NO
YES
NO
YES
...

user output
YES
NO
YES
NO
YES
...

Error:
4: 2
5: 60
6: 360
7: 2520
8: 20160

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

Error:
4: 2
5: 60
6: 360
7: 2520
8: 20160

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

Error:
4: 2
5: 60
6: 360
7: 2520
8: 20160