Submission #1236366

#TimeUsernameProblemLanguageResultExecution timeMemory
1236366PlayVoltzMechanical Doll (IOI18_doll)C++20
66.60 / 100
95 ms12040 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second

int counter=-1;
vector<int> x, y;

vector<pair<pii, int> > dnc(int d, int len){
	vector<pair<pii, int> > res;
	int node=++counter;
	if (!d){
		res.pb(mp(mp(node, 1), 2));
		if (len==2)res.pb(mp(mp(node, 0), 1));
		return res;
	}
	y[node]=-counter-2;
	vector<pair<pii, int> > l, r=dnc(d-1, min(len, 1<<d));
	if (len>(1<<d)){
		x[node]=-counter-2;
		l=dnc(d-1, len-(1<<d));
	}
	for (auto a:l)res.pb(mp(a.fi, a.se*2-1));
	for (auto a:r)res.pb(mp(a.fi, a.se*2));
	return res;
}

bool custom(pair<pii, int> a, pair<pii, int> b){
	return a.se<b.se;
}

void create_circuit(int m, vector<int> vect){
	vect.pb(0);
	vector<int> c(m+1, -1);
	int dep=ceil(log2(vect.size()));
	x.resize(2*vect.size(), -1);
	y.resize(2*vect.size(), -1);
	vector<pair<pii, int> > ord=dnc(dep, vect.size());
	sort(ord.begin(), ord.end(), custom);
	for (int i=0; i<vect.size(); ++i){
		if (ord[i].fi.se)y[ord[i].fi.fi]=vect[i];
		else x[ord[i].fi.fi]=vect[i];
	}
	while (x.back()==-1&&y.back()==-1)x.pop_back(), y.pop_back();
	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...