제출 #411865

#제출 시각아이디문제언어결과실행 시간메모리
411865amoo_safarBroken Device (JOI17_broken_device)C++17
100 / 100
50 ms2484 KiB
#include "Annalib.h"

#include <bits/stdc++.h>

using namespace std;

const int Z = 75;
vector< vector<int> > V;
bool init = false;

void Init(){
	srand(58);
	vector<int> per = {0, 1, 2};
	for(int i = 0; i < Z; i++){
		random_shuffle(per.begin(), per.end());
		V.push_back(per);
	}
	init = true;
}

void Anna( int n, long long X, int K, int P[] ){
	if(!init)
		Init();
	
	assert(n == 150);
	vector<int> mk(n, 0);
	for(int i = 0; i < K; i++)
		mk[P[i]] = 1;
	// for(int i = 0; i < N; i++){
	// 	if(i == N - 1){
	// 		Set(i, 0);
	// 		continue;
	// 	}
	// 	if(mk[i] || mk[i + 1])
	// 		Set(i, 0);
	// }
	// cerr << "^ ";
	for(int i = 0; i < n; i += 2){
		if(mk[i] && mk[i + 1]){
			Set(i, 0);
			Set(i + 1, 0);
			continue;
		}
		int rt = X % 3;
		int idx = 0;
		for(int j = 0; j < 3; j++)
			if(V[i / 2][j] == rt)
				idx = j;
		// assert(rt == idx);
		int br = mk[i] + mk[i] + mk[i + 1];
		if(br & (idx + 1)){
			Set(i, 0);
			Set(i + 1, 0);	
			continue;
		}
		// cerr << idx;
		X /= 3;
		// cerr << "# " << idx << '\n';
		Set(i, (idx + 1) / 2);
		Set(i + 1, (idx + 1) % 2);
	}
	// cerr << '\n';
	// cerr << "!! ";
	// for(int i = 0; i < 4; i++){
	// 	cerr << "(";
	// 	for(int j = 0; j < 3; j++)
	// 		cerr << V[i][j] << ",)"[j == 2];
	// 	// cerr << '\n';
	// }
	// cerr << '\n';
}
#include "Brunolib.h"

#include <bits/stdc++.h>

using namespace std;

const int Z = 75;
vector< vector<int> > V2;
bool init2 = false;

void Init2(){
	srand(58);
	vector<int> per = {0, 1, 2};
	for(int i = 0; i < Z; i++){
		random_shuffle(per.begin(), per.end());
		V2.push_back(per);
	}
	init2 = true;
}

long long Bruno( int n, int A[] ){
	if(!init2)
		Init2();
	assert(n == 150);
	long long res = 0;
	// cerr << "^^ ";
	for(int i = n - 2; i >= 0; i -= 2){
		if(A[i] == 0 && A[i + 1] == 0) continue;
		int rd = A[i] + A[i] + A[i + 1] - 1;
		rd = V2[i / 2][rd];
		// cerr << rd;
		res *= 3;
		res += rd;
	}
	// cerr << '\n';
	// cerr << "!! " << res << '\n';
	// cerr << "## ";
	// for(int i = 0; i < 4; i++){
	// 	cerr << "(";
	// 	for(int j = 0; j < 3; j++)
	// 		cerr << V2[i][j] << ",)"[j == 2];
	// 	// cerr << '\n';
	// }
	// cerr << '\n';
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...