Submission #422743

#TimeUsernameProblemLanguageResultExecution timeMemory
422743alireza_kavianiMechanical Doll (IOI18_doll)C++11
84 / 100
130 ms11584 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 3e5 + 10;

int cnt , ans[MAXN];
vector<int> vec , C , X , Y;

int reverse(int x){
	int ans = 0;
	for(int i = 0 ; i < cnt ; i++){
		ans = ans * 2 + ((x & (1 << i)) != 0);
	}
	return ans;
}

int solve(int ql , int qr , int l , int r){
	if(r <= ql || qr <= l)	return -1;
	if(r - l == 1)	return ans[l];
	int id = X.size();
	X.push_back(-1); Y.push_back(-1);
	int mid = l + r >> 1; 
	int a = solve(ql , qr , l , mid);
	int b = solve(ql , qr , mid , r);
	X[id] = a; Y[id] = b;
	return -(id + 1);
}

void create_circuit(int M, vector<int> A) {
	fill(ans , ans + MAXN , -1);
	int k = 1 , n = A.size();
	while(k < n)	k *= 2 , cnt++;
	for(int i = k - n ; i < k ; i++){
		vec.push_back(reverse(i));
	}
	sort(vec.begin() , vec.end());
	C.push_back(A[0]);
	for(int i = 0 ; i < n ; i++){
		ans[reverse(vec[i])] = (i + 1 < n ? A[i + 1] : 0);
	}
	for(int i = 0 ; i < M ; i++)	C.push_back(-1);
/*	for(int i = 0 ; i < k ; i++){
		cout << ans[i] << endl;
	}
*/	solve(k - n , k , 0 , k);
/*	for(int i : C)	cout << i << ' ';
	cout << endl;
	for(int i : X)	cout << i << ' ';
	cout << endl;
	for(int i : Y)	cout << i << ' ';
	cout << endl;*/
	answer(C , X , Y);
}

Compilation message (stderr)

doll.cpp: In function 'int solve(int, int, int, int)':
doll.cpp:23:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   23 |  int mid = l + r >> 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...