Submission #415783

#TimeUsernameProblemLanguageResultExecution timeMemory
415783LastRoninMechanical Doll (IOI18_doll)C++14
100 / 100
198 ms16620 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include "doll.h"
#define ll long long
#define pill pair<ll, ll>
#define ex exit(0)
#define f first
#define s second
#define mp make_pair
#define pb push_back
using namespace std;

const ll N = 8e5 + 100;

ll L[N], R[N];
int g[N], cur = 0, n;
vector<pill> x;
bool was[N];

void rec(ll v, ll l, ll r, ll z) {
	ll m = (l + r) >> 1ll;
	if(l == m) {
		if(z == 1)
			L[v] = 1000001;
		return;
	}	
	if(m - l + 1 > z) {
		L[v] = ++cur, rec(L[v], l, m, z);
		R[v] = ++cur, rec(R[v], m + 1, r, 0);
	}
	else {
		L[v] = 1000001, 
		R[v] = ++cur, rec(R[v], m + 1, r, z - (m - l + 1));
	}
}
void spusk(int v) {
	if(v == 1000001)return;
	if(was[v]) {
		was[v] = 0;
	    return (void)(R[v] == 0 ? x.pb(mp(v, 1)) : spusk(R[v]));
	}
	was[v] = 1;
	return (void)(L[v] == 0 ? x.pb(mp(v, 0)) : spusk(L[v]));	
}

void create_circuit(int m, vector<int> a) {
	n = a.size();
	a.pb(0);
	vector<int> C(m + 1, -1), X, Y;
	C[0] = a[0];    	
	ll z = __lg(n) + 1;
	ll d = (1<<z) - (n + 1);
	rec(0, 1, 1<<z, d);
	ll k = (1<<z);
	while(k--)spusk(0);
	for(int i = 1; i < (int)a.size(); i++)
		if(x[i].s)R[x[i].f] = a[i] + 1000002;
		else L[x[i].f] = a[i] + 1000002;
	for(int i = 0; i <= cur; i++) {
		if(L[i] > 1000000) 
			X.pb(L[i] - 1000002);
		else
			X.pb(-(L[i] + 1));
		if(R[i] > 1000000) 
			Y.pb(R[i] - 1000002);
		else
			Y.pb(-(R[i] + 1));
			
	}
	answer(C,X,Y);
}
#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...