제출 #1237506

#제출 시각아이디문제언어결과실행 시간메모리
1237506IrateArt Collections (BOI22_art)C++20
35 / 100
121 ms63204 KiB
#include<bits/stdc++.h>
#include "art.h"
using namespace std;
const int mxN = 4005;
vector<int>ANS, pos;
int n, QUERY = 0, hist[mxN][mxN];
int publish(vector<int>R);
// {
//     QUERY++;
//     int I = 0;
//     for(int i = 0;i < n;++i){
//         for(int j = i + 1;j < n;++j){
//             I += (pos[R[i]] > pos[R[j]]);
//         }
//     }
//     return I;
// }
void answer(vector<int>R);
// {
//     for(int i = 0;i < n;++i){
//         if(R[i] != ANS[i]){
//             cout << "ERRRR" << endl;
//             for(int j : R){
//                 cout << j << ' ';
//             }
//             cout << endl;
//             return;
//         }
//     }
// }
bool cmp(int a, int b){
    if(hist[a][b] != -1)return hist[a][b];
    vector<int>temp;
    for(int i = 1;i <= n;++i){
        if(i == a || i == b)continue;
        temp.push_back(i);
    }
    temp.push_back(a);
    temp.push_back(b);
    int I = publish(temp);
    swap(temp[n - 2], temp[n - 1]);
    int D = I - publish(temp);
    int ans = !(D > 0);
    hist[a][b] = ans;
    hist[b][a] = !ans;
    if(D > 0)return ans;
    return ans;
}
vector<int>gen(int n){
    vector<int>perm(n);
    for(int i = 1;i <= n;++i){
        perm[i - 1] = i;
    }
    for(int i = 0;i < 1000;++i){
        int a = rand() % n;
        int b = rand() % n;
        swap(perm[a], perm[b]);
    }
    return perm;
}
vector<int> Merge(vector<int>&left, vector<int>&right){
    vector<int>res;
    int l = 0, r = 0, n = left.size(), m = right.size();
    while(l < n && r < m){
        if(cmp(left[l], right[r]))res.push_back(left[l++]);
        else res.push_back(right[r++]);
    }
    while(l < n)res.push_back(left[l++]);
    while(r < m)res.push_back(right[r++]);
    return res;
}
vector<int> Sort(int l, int r){
    if(l == r)return {l + 1};
    int mid = (l + r) / 2;
    vector<int> left = Sort(l, mid);
    vector<int> right = Sort(mid + 1, r);
    return Merge(left, right);
}
void solve(int N){
    n = N;
    ANS = gen(n);
    pos.resize(n + 1);
    for(int i = 0;i < mxN;++i){
        for(int j = 0;j < mxN;++j){
            hist[i][j] = -1;
        }
    }
    for(int i = 0;i < n;++i){
        pos[ANS[i]] = i;
    }
    answer(Sort(0, n - 1));
    // cout << QUERY << '\n';
}
// int main(){
//     srand(time(0));
//     ios_base::sync_with_stdio(0);
//     cin.tie(0);
//     int N;
//     cin >> N;
//     solve(N);
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...