Submission #1227901

#TimeUsernameProblemLanguageResultExecution timeMemory
1227901jasonicMonster Game (JOI21_monster)C++20
0 / 100
28 ms484 KiB
#include "monster.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define fastIO cin.tie(0); ios::sync_with_stdio(false)

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

vector<int> dnc(vector<int> idcs, int lb, int rb) {
    if(idcs.size() <= 1) return idcs;
    if(idcs.size() == 2) {
        if(! Query(idcs[0], idcs[1])) { // 0 is less than
            swap(idcs[0], idcs[1]);
        }
        return idcs;
    }
    if(idcs.size() == 3) {
        bool x, y, z;
        vector<int> res, rest;
        if(lb != -1) {
            x = Query(idcs[0], lb);
            y = Query(idcs[1], lb);
            z = Query(idcs[2], lb);

            if(x == 0) {
                res.push_back(idcs[0]);
                rest = dnc({idcs[1], idcs[2]}, idcs[0], rb);
                res.insert(res.end(), rest.begin(), rest.end());
            } else if(y == 0) {
                res.push_back(idcs[1]);
                rest = dnc({idcs[0], idcs[2]}, idcs[1], rb);
                res.insert(res.end(), rest.begin(), rest.end());
            } else {
                res.push_back(idcs[2]);
                rest = dnc({idcs[1], idcs[2]}, idcs[2], rb);
                res.insert(res.end(), rest.begin(), rest.end());
            }
        } else {
            x = Query(idcs[0], rb);
            y = Query(idcs[1], rb);
            z = Query(idcs[2], rb);

            if(x == 1) {
                rest = dnc({idcs[1], idcs[2]}, idcs[0], rb);
                res.insert(res.end(), rest.begin(), rest.end());
                res.push_back(idcs[0]);
            } else if(y == 1) {
                rest = dnc({idcs[0], idcs[2]}, idcs[1], rb);
                res.insert(res.end(), rest.begin(), rest.end());
                res.push_back(idcs[1]);
            } else {
                rest = dnc({idcs[1], idcs[2]}, idcs[2], rb);
                res.insert(res.end(), rest.begin(), rest.end());
                res.push_back(idcs[2]);
            }
        }

        return res;
    }

    // int rand = rng();
    // int pivot = abs(rand)%idcs.size();
    int pivot = idcs.size()-1;
    vector<int> la, ra;
    int ls, rs; ls = rs = 0;

    for(int i = 0; i < idcs.size(); i++) {
        if(i == pivot) continue;
        if(Query(idcs[pivot], idcs[i])) {
            la.push_back(idcs[i]);
            ls++;
        } else {
            rs++;
            ra.push_back(idcs[i]);
        }
    }

    // cerr << ls << ' ' << rs << '\n';
    if(min(ls, rs) == 1) {
        if(ls == 1) {
            bool wrong = 0;
            for(auto i : ra) wrong ^= Query(la[0], i);

            if(wrong) {
                la.insert(la.end(), ra.begin(), ra.end());
                swap(la, ra);
                la = vector<int>();
            }
        } else {
            bool wrong = 0;
            for(auto i : la) wrong ^= Query(i, ra[0]);

            if(wrong) {
                la.insert(la.end(), ra.begin(), ra.end());
                ra = vector<int>();
            }
        }
    }

    // printf("idcs: "); for(auto &i : idcs) cout << i << ' '; cout << '\n';
    // printf("pivot: idcs[%d] = %d\n", pivot, idcs[pivot]);
    // printf("left arr: "); for(auto &i : la) cout << i << ' '; cout << '\n';
    // printf("rigt arr: "); for(auto &i : ra) cout << i << ' '; cout << '\n';

    la = dnc(la, lb, idcs[pivot]);
    ra = dnc(ra, idcs[pivot], rb);

    vector<int> ans;

    ans.insert(ans.end(), la.begin(), la.end());
    ans.push_back(idcs[pivot]);
    ans.insert(ans.end(), ra.begin(), ra.end());
    // printf("became: "); for(auto i : ans) cout << i << ' '; cout << '\n';

    return ans;
}

vector<int> Solve(int n) {
    vector<int> arr; for(int i = 0; i < n; i++) arr.push_back(i);
    vector<int> ans1 = dnc(arr, -1, n);
    vector<int> ans2(n);

    for(int i = 0; i < n; i++) ans2[ans1[i]] = i;

    return ans2;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...