Submission #429188

#TimeUsernameProblemLanguageResultExecution timeMemory
429188Popax21Painting Squares (IOI20_squares)C++14
0 / 100
117 ms600 KiB
#include <stddef.h>
#include <stdio.h>
#include <assert.h>
#include <vector>
#include "squares.h"

struct edge;

int seq[2048], iseq[1024], seqi = 0;
bool seq_init = false;

bool v[512][2] = {0};
void deBrujinSeq(int w) {
	for(int i = 0; i < 2; i++) {
		if(!v[w][i]) {
			v[w][i] = true;
			deBrujinSeq(((w << 1) | i) & 511);
			seq[seqi++] = i;
		}
	}
}

std::vector<int> paint(int n) {
	if(!seq_init) {
		//Create a De Brujn sequence
		deBrujinSeq(0);

		//Create a reverse lookup table
		std::fill(iseq+0, iseq+1023, -1);
		for(int i = 0; i <= 1024-10; i++) {
			int w = 0;
			for(int j = 0; j < 10; j++) {
				assert(seq[i+j] >= 0);
				w = (w << 1) | seq[i+j];
			}
			iseq[w & 1023] = i;
		}

		seq_init = true;
	}

	//Init labels from sequence
	std::vector<int> l(n+1);
	for(int i = 0; i < n; i++) l[i] = seq[i];
	l[n] = 10;

	return l;
}

int find_location(int n, std::vector<int> c) {
	assert(c.size() == 10);

	//Is at edge?
	if(c[9] < 0) {
		int p = 0;
		while(c[p] >= 0) p++;
		return n - p;
	}

	//Calculate word
	int w = 0;
	for(int i = 0; i < 10; i++) {
		assert(c[i] >= 0);
		w = (w << 1) | c[i];
	}

	//Lookup in LUT
	return iseq[w];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...