This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "library.h"
#include <bits/stdc++.h>
#define pb push_back
#define all(x) x.begin(), x.end()
using namespace std;
vector< vector<int> > V;
int n;
int Ask(int L, int R){
vector<int> Q(n, 0);
for(int i = L; i < R; i++)
for(int j : V[i])
Q[j] = 1;
// cerr << "#@$ ";
// for(auto x : Q) cerr << x;
// cerr << " -> " << Query(Q) << '\n';
return Query(Q);
}
bool Nei(int a, int b){
vector<int> Q(n, 0);
Q[a] = 1; Q[b] = 1;
return Query(Q) == 1;
}
int tri(int a, int b, int c){
vector<int> Q(n, 0);
Q[a] = 1; Q[b] = 1; Q[c] = 1;
return Query(Q);
}
void Insert(int i, int j){
assert(i < j);
for(auto x : V[j])
V[i].pb(x);
V[j].clear();
V.erase(V.begin() + j);
}
void Comb(int i, int j){
if(V[i].size() == 1) swap(V[i], V[j]);
if(V[j].size() == 1){
if((V[i].size() == 1) || (Nei(V[j][0], V[i].back()))){
Insert(i, j);
return ;
}
reverse(all(V[i]));
assert(Nei(V[i].back(), V[j][0]));
Insert(i, j);
return ;
}
if(tri(V[i][0], V[j][0], V[j].back()) == 2 - (V[j].size() == 2)) reverse(all(V[i]));
if(!Nei(V[i].back(), V[j][0])) reverse(all(V[j]));
Insert(i, j);
}
void Solve(int _n){
n = _n;
V.resize(n, vector<int>(0));
for(int i = 0; i < n; i++) V[i].pb(i);
int L, R, mid=0;
while((int) V.size() > 1){
// cerr << "! " << V.size() << '\n';
// cerr << "WTF : ";
// for(auto Y : V)
// cerr << Y.size() << ' ';
// cerr << '\n';
L = 1, R = V.size();
while(L + 1 < R){
mid = (L + R) >> 1;
if(Ask(0, mid) < mid) R = mid;
else L = mid;
}
int res = R - 1;
L = 0, R = res;
while(L + 1 < R){
mid = (L + R) >> 1;
if(Ask(mid, res + 1) < (res + 1 - mid)) L = mid;
else R = mid;
}
// cerr << "# " << L << ' ' << res << '\n';
Comb(L, res);
}
for(auto &x : V[0]) x++;
// cerr << "! " << n << ' ' << V[0].size() << '\n';
Answer(V[0]);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |