Submission #1043258

#TimeUsernameProblemLanguageResultExecution timeMemory
1043258yanb자동 인형 (IOI18_doll)C++14
82.60 / 100
93 ms20388 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_circuit6(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);
}

void create_circuit3(int k, vector<int> a) {
	int n = a.size();
	a.push_back(0);
	vector<vector<int>> g(k + 1);
	g[0].push_back(a[0]);
	for (int i = 0; i < n; i++) {
		g[a[i]].push_back(a[i + 1]);
	}
 
	vector<int> C(k + 1), X, Y;
	C[0] = g[0][0];
	for (int j = 1; j < k + 1; j++) {
		int cnt = g[j].size();
		int z = 1, ord = 0;
		while (z < cnt) {
			z *= 2;
			ord++;
		}
 
		if (ord == 0) {
			if (cnt == 1) C[j] = g[j][0];
			continue;
		}
 
		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));
			}
		}
 
		int wnots = X.size();
		C[j] = -wnots - 1;
 
		vector<int> v(z, -wnots - 1);
		for (int i = z - (int) g[j].size(); i < z; i++) {
			v[i] = g[j][i - z + (int) g[j].size()];
		}
 
		vector<int> vp(z);
		for (int i = 0; i < z; i++) {
			vp[p[i]] = v[i];
		}
 
		vector<int> X_(z), Y_(z);
		for (int ni = 1; ni < z / 2; ni++) {
			X_[ni] = -ni * 2 - wnots;
			Y_[ni] = -ni * 2 - 1 - wnots;
		}
		for (int ni = 0; ni < z / 2; ni++) {
			X_[ni + z / 2] = vp[ni * 2];
			Y_[ni + z / 2] = vp[ni * 2 + 1];
		}
 
		for (int i = 1; i < z; i++) {
			X.push_back(X_[i]);
			Y.push_back(Y_[i]);
		}
	}
 
	answer(C, X, Y);
}

void create_circuit(int k, vector<int> a) {
	map<int, int> freq;
	for (int x : a) {
		freq[x]++;
	}

	for (auto [_, cnt] : freq) {
		if (cnt > 4) {
			create_circuit6(k, a);
			return;
		}
	}

	create_circuit3(k, a);
}

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:177:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  177 |  for (auto [_, cnt] : freq) {
      |            ^
#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...