xyd 2025.6.21模考 T1
#include <bits/stdc++.h>
#include "archae.h"
#define FL(i, a, b) for (int i = (a); i <= (b); ++i)
#define FR(i, a, b) for (int i = (a); i >= (b); --i)
#define Sz(v) ((int)(v).size())
using namespace std;
const int N = 32770;
int n;
vector<int> g[N], ng[N];
namespace {
vector<int> Query(int x) {
if (Sz(g[x]) || Sz(ng[x])) {
return g[x];
}
FL(i, 1, n) {
if (query(x, i)) {
g[x].emplace_back(i);
} else if (x != i) {
ng[x].emplace_back(i);
}
}
return g[x];
}
}
namespace {
bool isAB(int x) { // cost n
auto v = Query(x);
return Sz(v) == n / 2;
}
bool isC(int x) { // cost 4n
auto v = Query(x);
return Sz(v) == 3 &&
(isAB(v[0]) + isAB(v[1]) + isAB(v[2])) == 2;
}
bool isD(int x) { // cost 2n
auto v = Query(x);
return Sz(v) == 1 && Sz(Query(v[0])) == 3;
}
}
namespace {
int FindD() { // at most 10n
int x = 1, y = 0;
vector<int> p = Query(x), q;
{
if (isAB(x)) { // cost n
for (int i: p) { // cost 5n
if (!isAB(i) && !isC(i)) {
x = i;
break;
}
}
} else if (isC(x)) { // cost 4n
for (int i: p) { // cost 4n
if (isD(i)) {
return i;
}
}
} else if (isD(x)) { // cost 2n
return x;
}
}
{
p = Query(x), q = ng[x];
while (!p.empty()) {
if (query(p.back(), q.back())) {
q.pop_back();
} else {
p.pop_back();
}
if (p.empty()) {
y = q.back();
break;
}
}
if (isD(y)) { // cost 2n
return y;
}
}
{
vector<int> vis(n + 1);
p = Query(x), q = Query(y);
for (int i: p) vis[i] = 1;
for (int i: q) vis[i] = 1;
FL(i, 1, n) { // at most 2n
if (vis[i]) continue;
vector<int> delp, delq;
while (Sz(p) || Sz(q)) {
if (!p.empty()) {
if (query(i, p.back())) {
for (int i: delq) {
q.emplace_back(i);
}
break;
} else {
delp.emplace_back(p.back());
p.pop_back();
}
}
if (!Sz(p) && !Sz(q)) {
return i;
}
p.swap(q);
delp.swap(delq);
}
}
}
assert(0);
}
}
vector<int> archae(int _n) {
setTestType(2);
n = _n;
FL(i, 0, n) {
g[i].clear();
ng[i].clear();
}
int D = ::FindD();
int C = ::Query(D).back();
int A = 0, B = 0;
for (int i: Query(C)) {
if (i != D) {
(!A? A : B) = i;
}
}
assert(isAB(A));
assert(isAB(B));
assert(isC(C));
assert(isD(D));
return {A, B, C, D};
}