Submission #69481

#TimeUsernameProblemLanguageResultExecution timeMemory
69481E869120Rail (IOI14_rail)C++14
30 / 100
168 ms98880 KiB
#include "rail.h"
#include <iostream>
using namespace std;

int p[100009], l[100009], dist[5009][5009];

int getDist(int a, int b) {
	if (a > b) swap(a, b);
	if (dist[a][b] != -1) return dist[a][b];
	int ZZ = getDistance(a, b);
	dist[a][b] = ZZ;
	return ZZ;
}

void findLocation(int N, int first, int location[], int stype[])
{
	for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) dist[i][j] = -1; }

	// ----------------------------------- 一審 -----------------------------------------
	int minx = (1 << 30), minid = 0;
	for (int i = 0; i < N; i++) { if (i == 0) continue; int z = getDist(0, i); if (z < minx) { minx = z; minid = i; } }

	l[minid] = minx; p[minid] = 2;
	l[0] = 0; p[0] = 1;

	// ----------------------------------- 二審 -----------------------------------------
	for (int i = 0; i < N; i++) {
		if (i == 0 || i == minid) continue;
		if (getDist(0, i) == getDist(0, minid) + getDist(minid, i)) {
			int t1 = getDist(minid, i);
			l[i] = l[minid] - t1; p[i] = 1;
		}
		else if (getDist(minid, i) == getDist(minid, 0) + getDist(0, i)) {
			int t2 = getDist(0, i);
			l[i] = t2; p[i] = 2;
		}
		else if (getDist(i, minid) < getDist(i, 0)) p[i] = 3;
		else p[i] = 4;
	}

	// ----------------------------------- 終審 -----------------------------------------
	int ret1 = 0, retm1 = 0; for (int i = 0; i < N; i++) { if (ret1 > l[i]) { ret1 = l[i]; retm1 = i; } }
	int ret2 = 0, retm2 = 0; for (int i = 0; i < N; i++) { if (ret2 < l[i]) { ret2 = l[i]; retm2 = i; } }
	for (int i = 0; i < N; i++) {
		if (p[i] == 3) {
			p[i] = 1;
			int z = getDist(retm1, i);
			l[i] = ret1 + z;
		}
		if (p[i] == 4) {
			p[i] = 2;
			int z = getDist(retm2, i);
			l[i] = ret2 - z;
		}
	}
	
	for (int i = 0; i < N; i++) location[i] = l[i] + first;
	for (int i = 0; i < N; i++) stype[i] = p[i];
	return;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...