Submission #140263

#TimeUsernameProblemLanguageResultExecution timeMemory
140263bazsi700Mechanical Doll (IOI18_doll)C++14
100 / 100
149 ms12196 KiB
#include <bits/stdc++.h>
#include "doll.h"
using namespace std;

#define MOD 1000000007
#define ll long long int
#define vi vector<int>
#define vii vector< vector<int> >
#define PI 3.1415926535897932384626433832795
#define INF 9223372036854775807LL
#define hashA 1257958787
#define hashB 1539500609
#define endl "\n"

vector<pair<int,int> > getorder(int cn) {
	//cout << "a" << endl;
	vector<pair<int,int> > ord;
	ord.push_back({0,0});
	cn/=2;
	while(cn) {
		int n = ord.size();
		//cout << n << endl;
		for(int i = 0; i < n; i++) {
			ord.push_back({ord[i].first+cn,0});
		}
		//cout << cn << endl;
		cn/=2;
	}
	cn = ord.size();
	for(int i = 0; i < cn; i++) {
		ord.push_back({ord[i].first,1});
	}
	return ord;
}


int onpos[20][270000];

void create_circuit(int m, std::vector<int> A) {
	vector<int> C(m+1,-1);
	int n = A.size();
	int cn = 1;
	int ends = 1;
	int layers = 1;
	while(2*ends < n+1) {
		cn*=2;
		cn++;
		ends*= 2;
		layers++;
	}
	onpos[0][0] = 1;
	vector<int> canget(25);
	canget[0] = ends*2;
	for(int i = 1; i < 25; i++) {
		canget[i] = canget[i-1]/2;
	}
	set<pair<int,pair<int,int> > > tobuild;
	tobuild.insert({0,{0,n+1}});
	int currind = 1;
	while(!tobuild.empty()) {
		auto it = tobuild.begin();
		auto nod = *it;
		tobuild.erase(it);
		int lay = nod.first;
		int pos = nod.second.first;
		int want = nod.second.second;
		onpos[lay][pos] = currind++;
		if(lay == layers-1) {
			continue;
		}
		if(canget[lay+1] >= want) {
			tobuild.insert({lay+1,{pos*2+1,want}});
		} else {
			tobuild.insert({lay+1,{pos*2,canget[lay+1]}});
			tobuild.insert({lay+1,{pos*2+1,want-canget[lay+1]}});
		}
	}
	vector<int> X (currind-1);
	vector<int> Y (currind-1);
	for(int lay = 0; lay < layers-1; lay++) {
		for(int i = 0; i < (1<<lay); i++) {
			if(onpos[lay][i]) {
			//	cout << lay << " " << i << " " << onpos[lay][i] << " " << onpos[lay+1][i*2] << " " << onpos[lay+1][i*2+1] << endl;
				if(onpos[lay+1][i*2]) {
					X[onpos[lay][i]-1] = -onpos[lay+1][i*2];
				} else {
					X[onpos[lay][i]-1] = -1;
				}
				if(onpos[lay+1][i*2+1]) {
					Y[onpos[lay][i]-1] = -onpos[lay+1][i*2+1];
				} else {
					Y[onpos[lay][i]-1] = -1;
				}
			}
		}
	}

	/*for(int i = 0; (i+1)*2 < cn; i++) {
		X[i] = -(i*2+2);
		Y[i] = -(i*2+3);
	}*/
	int ind = 0;
	//for(int i = 0; i < currind-1; i++) {
	//	cout << X[i] << " " << Y[i] << endl;
	//}
	//cout << "a" << endl;
	vector<pair<int,int> > ord = getorder(ends);
	//cout << ends << " " << ord.size() << endl;
	int lst = -1;
	for(int i = 0; i < 2*ends; i++) {
		if(onpos[layers-1][ord[i].first]) {
			//cout << ord[i].first << " ";
			//cout << onpos[layers-1][ord[i].first] << endl;
			if(ord[i].second == 0) {
				if(ind < n) {
					X[onpos[layers-1][ord[i].first]-1] = A[ind++];
				} else {
					X[onpos[layers-1][ord[i].first]-1] = -1;
				}
			} else {
				if(ind < n) {
					Y[onpos[layers-1][ord[i].first]-1] = A[ind++];
				} else {
					Y[onpos[layers-1][ord[i].first]-1] = -1;
				}
			}
			lst = onpos[layers-1][ord[i].first]-1;
		}
	}
	Y[lst] = 0;
	/*cout << "b" << endl;
	for(int i = 0; i < currind-1; i++) {
		cout << X[i] << " " << Y[i] << endl;
	}*/
	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...