제출 #310976

#제출 시각아이디문제언어결과실행 시간메모리
310976LawlietBroken Device (JOI17_broken_device)C++17
100 / 100
56 ms3328 KiB
#include "Annalib.h"
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 200;

int ans[MAXN];

bool blocked[MAXN];

vector<int> bits;

void Anna(int N, long long X, int K, int P[])
{
	bits.clear();
	
	memset( ans , 0 , sizeof(ans) );
	memset( blocked , false , sizeof(blocked) );

	for(int i = 0 ; i < K ; i++)
		blocked[ P[i] ] = true;

	for(int i = 0 ; i < 150 ; i++)
		bits.push_back( X%2 ), X /= 2;

	for(int i = 0 ; i < N ; i += 3)
	{
		int optQtd = 0;

		//Ver se consigo enviar 1

		if( bits[0] == 1 && !blocked[i + 2] ) optQtd = 1;
		if( bits[0] == 0 && !blocked[i + 1] ) optQtd = 1;
		if( bits[0] == 0 && !blocked[i] && !blocked[i + 2] ) optQtd = 1; 

		//Ver se consigo enviar 2

		if( bits[0] == 0 && bits[1] == 0 && !blocked[i + 1] && !blocked[i + 2] ) optQtd = 2;
		if( bits[0] == 0 && bits[1] == 1 && !blocked[i] && !blocked[i + 1] && !blocked[i + 2] ) optQtd = 2;
		if( bits[0] == 1 && bits[1] == 0 && !blocked[i] ) optQtd = 2;
		if( bits[0] == 1 && bits[1] == 1 && !blocked[i] && !blocked[i + 1] ) optQtd = 2;

		if( optQtd == 0 ) continue;

		if( optQtd == 2 )
		{
			if( bits[0] == 0 && bits[1] == 0 ) ans[i + 1] = ans[i + 2] = 1; 
			if( bits[0] == 0 && bits[1] == 1 ) ans[i] = ans[i + 1] = ans[i + 2] = 1;
			if( bits[0] == 1 && bits[1] == 0 ) ans[i] = 1;
			if( bits[0] == 1 && bits[1] == 1 ) ans[i] = ans[i + 1] = 1;

			bits.erase( bits.begin() ); 
			bits.erase( bits.begin() );

			continue;
		}

		if( bits[0] == 1 ) ans[i + 2] = 1;
		else
		{
			if( !blocked[i + 1] ) ans[i + 1] = 1;
			else ans[i] = ans[i + 2] = 1;
		}

		bits.erase( bits.begin() );
	}

	for(int i = 0 ; i < N ; i++)
		Set( i , ans[i] );
}
#include "Brunolib.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long int lli;

long long Bruno(int N, int A[])
{
	lli ans = 0;

	for(int i = N - 3 ; i >= 0 ; i -= 3)
	{
		//if( A[i] == 0 && A[i + 1] == 0 && A[i + 2] == 0 ) 
		if( A[i] == 0 && A[i + 1] == 0 && A[i + 2] == 1 ) ans *= 2, ans += 1;
		if( A[i] == 0 && A[i + 1] == 1 && A[i + 2] == 0 ) ans *= 2, ans += 0;
		if( A[i] == 0 && A[i + 1] == 1 && A[i + 2] == 1 ) ans *= 4, ans += 0;
		if( A[i] == 1 && A[i + 1] == 0 && A[i + 2] == 0 ) ans *= 4, ans += 1;
		if( A[i] == 1 && A[i + 1] == 0 && A[i + 2] == 1 ) ans *= 2, ans += 0;
		if( A[i] == 1 && A[i + 1] == 1 && A[i + 2] == 0 ) ans *= 4, ans += 3;
		if( A[i] == 1 && A[i + 1] == 1 && A[i + 2] == 1 ) ans *= 4, ans += 2;
	}

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