제출 #469988

#제출 시각아이디문제언어결과실행 시간메모리
469988OmegamanBroken Device (JOI17_broken_device)C++14
0 / 100
45 ms2368 KiB
#include "Annalib.h"
#include <math.h>


bool isInArr(int ArrLen, int Arr[], int val) {
	for ( int i = 0; i < ArrLen; i++ )
		if (Arr[i] == val)
			return true;
	return false;
}

void Anna(int N, long long X, int K, int P[]){
	bool d[N];
	long long x = X;
	for( int i = 0; i < N; i++ ){
		d[i] = x % 2;
		x /= 2;
	}

	bool F[N];

	for ( int i = 0; i < N; i++ ) {
		F[i] = !isInArr(K, P, i);
	}
	
	bool M[N];

	int dh = 0;
	for( int i = 0; i < N; i+=3) {
		int m = 0;
		if (dh < 60) {
			int broken = (int)!F[i+0] + (int)!F[i+1] + (int)!F[i+2];

			if (broken < 2) {
				//  [ 00 ]
				if ( !d[dh] && !d[dh+1] ) {
					if (F[i + 1] && F[i + 2] ) {
						m = 3;
						dh++;
					} else {
						m = 4;
					}
				}
				// [ 01 ]
				else if ( !d[dh] && d[dh+1] ) {
					if (F[i + 0] && F[i + 2] ) {
						m = 5;
						dh++;
					} else {
						m = 2;
					}
				}
				//  [ 10 ]
				else if ( d[dh] && !d[dh+1] ) {
					if (F[i + 0] && F[i + 1] ) {
						m = 6;
						dh++;
					} else {
						m = 1;
					}
				}
				//  [ 11 ]
				else if ( d[dh] && d[dh+1] ) {
					if (F[i + 0] && F[i + 1] && F[i + 2] ){
						m = 7;
						dh++;
					} else {
						m = 1;
					}
				}
				dh++;
			} else if ( broken < 3 ) {
				if ( d[dh] ) {
					if (F[i+2]) {
						m = 1;
						dh++;
					}
				} else {
					if (F[i+0]) {
						m = 4;
						dh++;
					}
					if (F[i+1]) {
						m = 2;
						dh++;
					}
				}
			}
		}

		M[i + 2] = m % 2; m /= 2;
		M[i + 1] = m % 2; m /= 2;
		M[i + 0] = m % 2;
	}

	for ( int i = 0; i < N; i++ ) {
		Set(i, (int)M[i]);
	}
}
#include "Brunolib.h"

long long Bruno( int N, int A[] ) {
	long long X = 0;
	long long inc = 1;

	int len = (N < 60 ? N : 60);

	bool d[len];
	for( int i = 0; i < len; i++)
		d[i] = 0;

	int dh = 0;
	for( int i = 0; i < N; i+=3) {
		int m = (int)A[i+0] * 4 + (int)A[i+1] * 2 + (int)A[i+2] * 1;
		switch (m) {
			case 0:
				break;
			case 1:
				d[dh++] = 1;
				break;
			case 2:
				d[dh++] = 0;
				break;
			case 3:
				d[dh++] = 0;
				d[dh++] = 0;
				break;
			case 4:
				d[dh++] = 0;
				break;
			case 5:
				d[dh++] = 0;
				d[dh++] = 1;
				break;
			case 6:
				d[dh++] = 1;
				d[dh++] = 0;
				break;
			case 7:
				d[dh++] = 1;
				d[dh++] = 1;
				break;
		}
	}

	for (int i = 0; i < len; i++) {
		X += inc * d[i];
		inc *= 2;
	}

	return X;
}
#Verdict Execution timeMemoryGrader output
Fetching results...