Submission #417485

#TimeUsernameProblemLanguageResultExecution timeMemory
417485maximath_1Navigation 2 (JOI21_navigation2)C++17
75 / 100
799 ms836 KiB
#include "Anna.h"
#include <vector>
using namespace std;

vector<int> r, c;

int group(int i, int j){
	return 3 * (i % 3) + j % 3;
}
int f(int i, int j){
	int gt = group(i, j);

	if(gt == 0) return 14; // fixed group as "compass"
	if(gt == 8) return 1; // unused group
	gt --;

	// far cells (chebyshev distance >= 2)
	if(c[gt] > j + 1) return 1;
	if(c[gt] < j - 1) return 2;
	if(r[gt] > i + 1) return 3;
	if(r[gt] < i - 1) return 4;

	// close cells (otherwise)
	return 5 + 3 * (r[gt] - (i - 1)) + (c[gt] - (j - 1));
}

void Anna(int N, int K, vector<int> R, vector<int> C) {
	r = R; c = C;
	for(int i = 0; i < N; i ++)
		for(int j = 0; j < N; j ++)
			SetFlag(i, j, f(i, j));
}
#include "Bruno.h"
#include <vector>
using namespace std;

int tp[3][3];

void fill(int r, int c){ // fill tp numbering if (r, c) is compass
	for(int i = -2; i <= 2; i ++)
		for(int j = -2; j <= 2; j ++)
			if(0 <= r + i && r + i <= 2 && 0 <= c + j && c + j <= 2){
				tp[r + i][c + j] = 3 * ((i + 3) % 3) + (j + 3) % 3;
			}
}

vector<int> Bruno(int K, vector<int> value) {
	vector<int> ans(K, 0);

	for(int i = 0; i < 3; i ++)
		for(int j = 0; j < 3; j ++)
			if(value[3 * i + j] == 14){
				fill(i, j); break;
			}

	for(int i = 0; i < 3; i ++)
		for(int j = 0; j < 3; j ++){
			if(tp[i][j] == 0 || tp[i][j] == 8) continue;

			if(value[3 * i + j] < 5)
				ans[tp[i][j] - 1] = value[3 * i + j] - 1;
			else{
				int gt = value[3 * i + j] - 5;
				int x = gt / 3, y = gt % 3;
				int fi = i - 1 + x, sc = j - 1 + y;
				if(sc > 1) gt = 0;
				else if(sc < 1) gt = 1;
				else if(fi > 1) gt = 2;
				else if(fi < 1) gt = 3;
				else gt = 4;
				ans[tp[i][j] - 1] = gt;
			}
		}

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