Submission #423526

#TimeUsernameProblemLanguageResultExecution timeMemory
42352679brueMonster Game (JOI21_monster)C++17
100 / 100
126 ms328 KiB
#include <bits/stdc++.h>
#include "monster.h"

using namespace std;

typedef long long ll;

namespace {
    int n;
    int arr[1002];
    int arr2[1002];

    void Sort(int l, int r){
        if(l>=r) return;
        int m = (l+r)>>1;
        Sort(l, m);
        Sort(m+1, r);

        for(int i=l; i<=r; i++) arr2[i] = arr[i];
        for(int i=l, j=m+1, k=l; k<=r; k++){
            if(i==m+1) arr[k] = arr2[j++];
            else if(j==r+1) arr[k] = arr2[i++];
            else if(Query(arr2[i], arr2[j]) == 0) arr[k] = arr2[i++];
            else arr[k] = arr2[j++];
        }
    }

    void calculateElse(int tmp, int st){
        for(int i=st; i<n; i++){
            if(Query(arr[tmp], arr[i])){
                reverse(arr+tmp+1, arr+i+1);
                tmp = i;
            }
        }
    }

    void Reorder(int l, int r){
        if((r-l) <= 7){
            int cnt[1005] = {0};
            for(int i=l; i<=r; i++){
                for(int j=i+1; j<=r; j++){
                    if(Query(arr[i], arr[j])) cnt[arr[i]]++;
                    else cnt[arr[j]]++;
                }
            }
            sort(arr+l, arr+r+1, [&](int x, int y){
                return cnt[x] < cnt[y];
            });
            if(Query(arr[l], arr[l+1]) == 0) swap(arr[l], arr[l+1]);
            if(Query(arr[r], arr[r-1])) swap(arr[r], arr[r-1]);
            return;
        }

        int comp[1005] = {0};
        int cnt = 0;
        int lim = r;
        for(int i=l+1; i<=r; i++){
            if(Query(arr[l], arr[i])) comp[i] = 1, cnt++;
            if(comp[i-1] && !comp[i]){
                lim = i-1;
                break;
            }
        }
        if(cnt >= 2){ /// Case 1
            assert(lim >= l+3);
            if(Query(arr[lim], arr[lim-2])) reverse(arr+l, arr+lim);
            else reverse(arr+l, arr+lim+1);
            calculateElse(lim, lim+1);
            return;
        }
        else if(lim >= l+3){ /// Case 2
            if(Query(arr[l+1], arr[lim])) reverse(arr+l+1, arr+lim+1);
            else reverse(arr+l+2, arr+lim+1), swap(arr[l], arr[l+1]);
            calculateElse(lim, lim+1);
        }
        else if(lim==1){ /// Case 3
            Reorder(l+2, r);
        }
        else{ /// Case 4
            Reorder(l+3, r);
            if(Query(arr[l], arr[l+3])){
                reverse(arr+l, arr+l+3);
            }
            else if(Query(arr[l+1], arr[l+3])){
                swap(arr[l+1], arr[l+2]);
            }
            else{
                swap(arr[l], arr[l+1]);
            }
        }
    }
}

vector<int> Solve(int N){
    n = N;
    for(int i=0; i<n; i++) arr[i] = i;
    random_shuffle(arr, arr+n);
    Sort(0, n-1);

    Reorder(0, n-1);

//    for(int i=0; i<n; i++) printf("%d ", arr[i]);
//    puts("");

    vector<int> idx (n);
    for(int i=0; i<n; i++) idx[arr[i]] = i;
    return idx;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...