Submission #1212781

#TimeUsernameProblemLanguageResultExecution timeMemory
1212781k1r1t0Magic Show (APIO24_show)C++20
100 / 100
2 ms632 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

ll setN(int n);

vector<pair<int, int>> Alice() {
///////////////////////////////////////////////////////////////
	const int K = 60;
	const int T = 83;
	const int N = K * T;
	const int S = 2341234;
	mt19937 rng(S);
	vector<int> ord(N);
	iota(begin(ord), end(ord), 0);
	shuffle(begin(ord), end(ord), rng);
	vector<int> bt[K];
	for (int i = 0; i < K; i++) {
		bt[i].clear();
		for (int j = i * T; j < (i + 1) * T; j++)
			bt[i].push_back(ord[j]);
	}
	vector<int> zero(N), one(N);
	for (int i = 0; i < N; i++) {
		int cnt = i + 2;
		zero[i] = rng() % cnt;
		one[i] = rng() % (cnt - 1);
		if (zero[i] <= one[i]) one[i]++;
		zero[i] -= 2;
		one[i] -= 2;
	}
///////////////////////////////////////////////////////////////
	ll X = setN(N + 2);
	vector<pair<int, int>> tt;
	for (int i = 0; i < K; i++) {
		int b = (X >> i) & 1;
		for (int j : bt[i]) {
			int k = (b == 0 ? zero[j] : one[j]);
			tt.push_back({j + 3, k + 3});
		}
	}
	tt.push_back({1, 2});
	return tt;
///////////////////////////////////////////////////////////////
}
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

ll Bob(vector<pair<int, int>> V) {
///////////////////////////////////////////////////////////////
	const int K = 60;
	const int T = 83;
	const int N = K * T;
	const int S = 2341234;
	mt19937 rng(S);
	vector<int> ord(N);
	iota(begin(ord), end(ord), 0);
	shuffle(begin(ord), end(ord), rng);
	vector<int> bt[K];
	for (int i = 0; i < K; i++) {
		bt[i].clear();
		for (int j = i * T; j < (i + 1) * T; j++)
			bt[i].push_back(ord[j]);
	}
	vector<int> zero(N), one(N);
	for (int i = 0; i < N; i++) {
		int cnt = i + 2;
		zero[i] = rng() % cnt;
		one[i] = rng() % (cnt - 1);
		if (zero[i] <= one[i]) one[i]++;
		zero[i] -= 2;
		one[i] -= 2;
	}
///////////////////////////////////////////////////////////////
	int vv[N];
	for (int i = 0; i < N; i++)
		vv[i] = -3;
	for (auto [u, v] : V) {
		if (u > v) swap(u, v);
		if (v >= 2)
			vv[v - 3] = u - 3;
	}
	ll X = 0;
	for (int i = 0; i < K; i++) {
		int b = -1;
		for (int j : bt[i]) {
			if (vv[j] == -3) continue;
			if (vv[j] == zero[j]) b = 0;
			else b = 1;
			break;
		}
		assert(b != -1);
		if (b) X |= (1ll << i);
	}
	return X;
///////////////////////////////////////////////////////////////
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...