#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |