Submission #627710

#TimeUsernameProblemLanguageResultExecution timeMemory
627710MilosMilutinovicBroken Device (JOI17_broken_device)C++14
65 / 100
39 ms2416 KiB
#include "Annalib.h"
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < (int)(n); i ++)
#define rep1(i, n) for(int i = 1; i <= (int)(n); i ++)
#define MP make_pair

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

vector<int> ord = {138,6,105,87,111,3,123,63,141,36,66,54,30,45,129,147,27,84,135,24,12,21,57,126,102,9,75,144,99,117,96,18,132,69,42,114,0,93,108,120,60,72,90,33,48,81,39,78,51,15};

bool broken[150];

void Anna(int N, long long X, int K, int P[])
{
	rep(i, 150) broken[i] = false;
	rep(i, K) broken[P[i]] = true;
	LL pw = 1;
	while(pw + pw <= X) pw *= 3;
	vector<int> bits;
	while(X > 0) {
		int cc = 0;
		while(X >= pw) cc ++, X -= pw;
		bits.push_back(cc);
		pw /= 3;
	}
	while(pw > 0) {
		bits.push_back(0);
		pw /= 3;
	}
	reverse(bits.begin(), bits.end());
	while(bits.back() == 0) bits.pop_back();
 	int ptr = 0;
 	for(int i : ord) {
		int sum = 0;
		if(!broken[i + 0]) sum ++;
		if(!broken[i + 1]) sum ++;
		if(!broken[i + 2]) sum ++;
		if(ptr >= (int) bits.size() || sum == 0) {
			Set(i + 0, 0);
			Set(i + 1, 0);
			Set(i + 2, 0);
			continue;
		}
		if(bits[ptr] == 0) {
			if(!broken[i + 0]) {
				Set(i + 0, 1);
				Set(i + 1, 0);
				Set(i + 2, 0);
				ptr ++;
				continue;
			}
			if(!broken[i + 1] && !broken[i + 2]) {
				Set(i + 0, 0);
				Set(i + 1, 1);
				Set(i + 2, 1);
				ptr ++;
				continue;
			}
			Set(i + 0, 0);
			Set(i + 1, 0);
			Set(i + 2, 0);
			continue;
		}
		if(bits[ptr] == 1) {
			if(!broken[i + 1]) {
				Set(i + 0, 0);
				Set(i + 1, 1);
				Set(i + 2, 0);
				ptr ++;
				continue;
			}
			if(!broken[i + 0] && !broken[i + 2]) {
				Set(i + 0, 1);
				Set(i + 1, 0);
				Set(i + 2, 1);
				ptr ++;
				continue;
			}
			Set(i + 0, 0);
			Set(i + 1, 0);
			Set(i + 2, 0);
			continue;
		}
		if(bits[ptr] == 2) {
			if(!broken[i + 2]) {
				Set(i + 0, 0);
				Set(i + 1, 0);
				Set(i + 2, 1);
				ptr ++;
				continue;
			}
			if(!broken[i + 0] && !broken[i + 1]) {
				Set(i + 0, 1);
				Set(i + 1, 1);
				Set(i + 2, 0);
				ptr ++;
				continue;
			}
			Set(i + 0, 0);
			Set(i + 1, 0);
			Set(i + 2, 0);
			continue;
		}
		ptr ++;
	}
}
#include "Brunolib.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> ord = {138,6,105,87,111,3,123,63,141,36,66,54,30,45,129,147,27,84,135,24,12,21,57,126,102,9,75,144,99,117,96,18,132,69,42,114,0,93,108,120,60,72,90,33,48,81,39,78,51,15};

long long Bruno(int N, int A[])
{
	long long X = 0, pw = 1;
	for(int i : ord) {
		int sum = A[i] + A[i + 1] + A[i + 2];
		for(int j = 0; j < 3; j++) {
			if(sum == 1 && A[i + j] == 1) {
				X += pw * j;
				pw *= 3;
			}
			if(sum == 2 && A[i + j] == 0) {
				X += pw * j;
				pw *= 3;
			}
		}
	}
	return X;
}
#Verdict Execution timeMemoryGrader output
Fetching results...