Submission #1032737

#TimeUsernameProblemLanguageResultExecution timeMemory
1032737AmirAli_H1Mechanical Doll (IOI18_doll)C++17
85.55 / 100
111 ms66636 KiB
// In the name of Allah

#include <bits/stdc++.h>
#include "doll.h"
using namespace std;

typedef		long long int			ll;
typedef		long double				ld;
typedef		pair<int, int>			pii;
typedef		pair<ll, ll>			pll;
typedef		complex<ld>				cld;

#define		all(x)					(x).begin(),(x).end()
#define		len(x)					((ll) (x).size())
#define		F						first
#define		S						second
#define		pb						push_back
#define		sep						' '
#define		endl					'\n'
#define		Mp						make_pair
#define		kill(x)					cout << x << '\n', exit(0)
#define		set_dec(x)				cout << fixed << setprecision(x);
#define		file_io(x,y)			freopen(x, "r", stdin); freopen(y, "w", stdout);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int maxn = 1e6 + 4;

int n, m, sz;
vector<int> ls[maxn];
vector<int> adj[maxn], Ax, A1, A2;

void solve(int v, vector<int> ls) {
	if (len(ls) == 0) {
		adj[v].pb(v);
		return ;
	}
	else {
		bool flag = 1; int val = ls[0];
		for (int i = 0; i < len(ls); i++) {
			if (ls[i] != val) {
				flag = 0;
				break;
			}
		}
		if (flag) {
			adj[v].pb(ls[0]);
			return ;
		}
	}
	
	int u = sz++; adj[v].pb(u);
	int R = (1 << __lg(len(ls)));
	if (R != len(ls)) {
		R *= 2; int k = R - len(ls);
		vector<int> lsx;
		lsx.resize(R); fill(all(lsx), -1);
		while (k > 0) {
			int j = __builtin_ctz(k); k ^= (1 << j);
			int w = (R / (1 << j));
			for (int i = (w / 2); i < R; i += w) lsx[i] = u;
		}
		int j = 0;
		for (int i = 0; i < len(lsx); i++) {
			if (lsx[i] == -1) {
				lsx[i] = ls[j]; j++;
			}
		}
		ls = lsx;
	}
	
	vector<int> ls0, ls1;
	for (int i = 0; i < len(ls); i++) {
		if (i % 2 == 0) ls0.pb(ls[i]);
		else ls1.pb(ls[i]);
	}
	solve(u, ls0); solve(u, ls1);
}

void create_circuit(int Mx, vector<int> A) {
	m = Mx; n = len(A);
	ls[0].pb(A[0]);
	for (int i = 1; i < n; i++) {
		ls[A[i - 1]].pb(A[i]);
	}
	ls[A.back()].pb(0);
	
	sz = m + 1;
	for (int i = 0; i <= m; i++) {
		solve(i, ls[i]);
	}
	
	Ax.resize(m + 1); A1.resize(sz - m - 1); A2.resize(sz - m - 1);
	for (int i = 0; i <= m; i++) {
		int u = adj[i][0];
		if (u <= m) Ax[i] = u;
		else Ax[i] = -(u - m);
	}
	for (int i = m + 1; i < sz; i++) {
		int j = i - m - 1;
		int u1 = adj[i][0], u2 = adj[i][1];
		if (u1 <= m) A1[j] = u1;
		else A1[j] = -(u1 - m);
		if (u2 <= m) A2[j] = u2;
		else A2[j] = -(u2 - m);
	}
	
	answer(Ax, A1, A2);
}
#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...