Submission #1244525

#TimeUsernameProblemLanguageResultExecution timeMemory
1244525lovrotICC (CEOI16_icc)C++20
61 / 100
121 ms632 KiB
#define db(...) //fprintf(stderr, __VA_ARGS__)
#include "icc.h"
#include <cstdio>
#include <random>
#include <chrono>
#include <algorithm>
#include <vector>
#include <cstring>

#define X first
#define Y second
#define PB push_back

using namespace std;

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

typedef long long ll;
typedef pair<int, int> pii;

const int N = 110;

int n, un[N];

int trazi(int u) { return un[u] == u ? u : un[u] = trazi(un[u]); }

void unija(int u, int v) { 
	u = trazi(u);
	v = trazi(v);
	un[u] = v;
}

void include(int u, vector<int> &v) { 
	for(int i = 1; i <= n; ++i) { 
		if(trazi(i) == u) { v.PB(i); }
	}
}

bool _query(vector<int> a, vector<int> b) { 
	int s = a.size(), s_ = b.size();
	int x[s], y[s_];
	for(int i = 0; i < s; ++i) { x[i] = a[i]; }
	for(int i = 0; i < s_; ++i) { y[i] = b[i]; }
	return query(s, s_, x, y);
}

void debug(vector<int> &v, const char c[]) { 
	db("%s ", c);
	for(int x : v) db("%d ", x);
	db("\n");
}

void run(int nn) { 
	n = nn;
	for(int i = 1; i <= n; ++i) { un[i] = i; }

	for(int ii = 0; ii < n - 1; ++ii) { 
		vector<int> u, a, b;
		for(int i = 1; i <= n; ++i) { 
			if(trazi(i) == i) { u.PB(i); }
		}

		debug(u, "unions");

		for(; 1; ) { 
			shuffle(u.begin(), u.end(), rng);

			a.clear();
			b.clear();
			for(int i = 0; i < (int) u.size(); ++i) { 
				if(i < (int) u.size() / 2) { a.PB(u[i]); }
				else { b.PB(u[i]); }
			}

			vector<int> A, B;
			for(int i : a) { include(i, A); }
			for(int i : b) { include(i, B); }
			if(_query(A, B)) { break; }
		}

		vector<int> A, B;
		for(int i : a) { include(i, A); }
		for(int i : b) { include(i, B); }

		debug(A, "A");
		debug(B, "B");

		int lo = -1, hi = (int) A.size() - 1;
		for(int mi = (lo + hi) / 2; hi - lo > 1; mi = (lo + hi) / 2) { 
			vector<int> A_;
			for(int i = 0; i <= mi; ++i) { A_.PB(A[i]); }
			if(_query(A_, B)) { hi = mi; }
			else { lo = mi; }
		}

		int ans = A[hi];

		lo = -1;
		hi = B.size() - 1;
		for(int mi = (lo + hi) / 2; hi - lo > 1; mi = (lo + hi) / 2) { 
			vector<int> B_;
			for(int i = 0; i <= mi; ++i) { B_.PB(B[i]); }
			if(_query(A, B_)) { hi = mi; }
			else { lo = mi; }
		}

		db(">>> %d - %d <<<\n", ans, B[hi]);
		setRoad(ans, B[hi]);
		unija(ans, B[hi]);
	}

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