Submission #1043255

#TimeUsernameProblemLanguageResultExecution timeMemory
1043255yanbMechanical Doll (IOI18_doll)C++14
66.60 / 100
58 ms17732 KiB
#include <bits/stdc++.h>

using namespace std;
    
//#define int long long
#define pii pair<int, int>

void answer(vector<signed> C, vector<signed> X, vector<signed> Y);

void dfs(vector<int> &X, vector<int> &Y, int v) {
	int u = X[-v - 1];
	if (u < -1) {
		dfs(X, Y, u);
		if (X[-u - 1] == -1 && Y[-u - 1] == -1) X[-v - 1] = -1;
	}
	u = Y[-v - 1];
	if (u < -1) {
		dfs(X, Y, u);
		if (X[-u - 1] == -1 && Y[-u - 1] == -1) Y[-v - 1] = -1;
	}
}

void create_circuit(int k, vector<int> a) {
	a.push_back(0);
	int n = a.size();

	vector<int> C(k + 1, -1), X, Y;

	int cnt = n;
	int z = 1, ord = 0;
	while (z < cnt) {
		z *= 2;
		ord++;
	}
	ord = max(1, ord);

	vector<int> p(z);
	p[0] = 0;
	for (int i = 0; i < ord; i++) {
		for (int ni = 0; ni < (1 << i); ni++) {
			p[(1 << i) + ni] = p[ni] + (1 << (ord - i - 1));
		}
	}

	for (int i = 0; i < z - n; i++) p[i] = -1;
	vector<pii> mp(z);
	for (int i = 0; i < z; i++) mp[i] = {p[i], i};
	sort(mp.begin(), mp.end());
	for (int i = z - n; i < z; i++) {
		p[mp[i].second] = i - z + n;
	}

	vector<int> v(z);
	for (int i = 0; i < z; i++) {
		v[i] = (p[i] == -1 ? -1 : a[p[i]]);
	}

	vector<int> X_(z), Y_(z);
	for (int ni = 1; ni < z / 2; ni++) {
		X_[ni] = -ni * 2 - 1;
		Y_[ni] = -ni * 2;
	}
	for (int ni = 0; ni < z / 2; ni++) {
		X_[z - ni - 1] = v[ni * 2];
		Y_[z - ni - 1] = v[ni * 2 + 1];
	}

	for (int i = 1; i < z; i++) {
		X.push_back(X_[i]);
		Y.push_back(Y_[i]);
	}

	dfs(X, Y, -1);

	/*for (int x : X) cout << x << " ";
	cout << "\n";
	for (int x : Y) cout << x << " ";
	cout << "\n\n";*/

	vector<int> Xf, Yf, f(z);
	int tm = -1;
	for (int i = 0; i < z - 1; i++) {
		if (X[i] == -1 && Y[i] == -1) continue;
		f[i] = tm;
		tm--;
	}

	/*for (int i = 0; i < z; i++) {
		cout << f[i] << " ";
	}
	cout << "\n\n";*/

	for (int i = 0; i < z; i++) {
		if (X[i] == -1 && Y[i] == -1) continue;
		Xf.push_back(X[i] < 0 ? f[-X[i] - 1] : X[i]);
		Yf.push_back(Y[i] < 0 ? f[-Y[i] - 1] : Y[i]);
	}

	/*for (int x : Xf) cout << x << " ";
	cout << "\n";
	for (int x : Yf) cout << x << " ";
	cout << "\n";*/

	answer(C, Xf, Yf);
}
#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...