临时剪贴板

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};
}
posted @ 2025-06-21 21:11  徐子洋  阅读(7)  评论(0)    收藏  举报