제출 #1333527

#제출 시각아이디문제언어결과실행 시간메모리
1333527Jawad_Akbar_JJ자동 인형 (IOI18_doll)C++20
100 / 100
66 ms14856 KiB
#include <iostream>
#include <vector>
#include "doll.h"
#include <algorithm>

using namespace std;
int NN, n, it, pnt;
vector<pair<int, pair<int, int>>> ord;
vector<int> swt[2];

void order(int cur, int d = 0, int pr = 0, int st = 1, int en = NN, int id = 0, int sum = 0, int lv = 0){
	if (en - st == 1){
		it--;
		ord.push_back({id, {pr, d}});
		return;
	}

	int mid = (st + en) / 2, sz = mid - st;
	if (sum + sz >= n)
		swt[0][cur] = -1;
	else
		it++, swt[0][cur] = -it, order(it, 0, cur, st, mid, id, sum + sz, lv + 1);

	it++, swt[1][cur] = -it, order(it, 1, cur, mid, en, id + (1<<lv), sum, lv + 1);
}

void create_circuit(int m, vector<int> A){
	A.push_back(0);
	NN = n = A.size();
	while (__builtin_popcount(NN) > 1)
		NN++;
	NN++;
	swt[0].resize(2 * NN, 0);
	swt[1].resize(2 * NN, 0);

	order(++it);
	sort(begin(ord), end(ord));

	for (auto [i, pr] : ord)
		swt[pr.second][pr.first] = A[pnt++];
	
	while (swt[0].back() == 0)
		swt[0].pop_back(), swt[1].pop_back();
	swt[0].erase(begin(swt[0]));
	swt[1].erase(begin(swt[1]));

	vector<int> trg(m + 1, -1);
	answer(trg, swt[0], swt[1]);
}
#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...