제출 #295129

#제출 시각아이디문제언어결과실행 시간메모리
295129Saboon자동 인형 (IOI18_doll)C++17
100 / 100
194 ms8152 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 10;
const int inf = 1e8;
vector<int> X,Y;
bool mark[maxn];
int n, Sz, newint = 1;

int build(int L, int R, int x){
	if (L+1 == R)
		return inf;
	int id = newint ++;
	X.push_back(1), Y.push_back(1);
	int mid = (L+R) >> 1;
	if (x < mid)
		X[id-1] = build(L, mid, x);
	Y[id-1] = build(mid, R, x);
	return id;
}

int assign(int id, int L, int R, int x){
	if (id == 1)
		L = 0, R = Sz;
	if (L+1 == R)
		return -x;
	int mid = (L + R) >> 1;
	if (mark[id-1] == 0){
		mark[id-1] ^= 1;
		X[id-1] = assign(X[id-1], L, mid, x);
	}
	else{
		mark[id-1] ^= 1;
		Y[id-1] = assign(Y[id-1], mid, R, x);
	}
	return id;
}

void create_circuit(int m, vector<int> A){
	n = A.size();
	Sz = n+1;
	while (__builtin_popcount(Sz) != 1)
		Sz ++;
	vector<int> C(m+1);
	for (int i = 0; i < m+1; i++)
		C[i] = -1;
	build (0, Sz,Sz-n-1);
	for (int i = 0; i < n; i++)
		assign(1, 0, Sz, A[i]);
	assign(1, 0, Sz, 0);
	for (int i = 1; i < newint; i++)
		X[i-1] *= -1, Y[i-1] *= -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...