Submission #587566

#TimeUsernameProblemLanguageResultExecution timeMemory
587566benson1029Towns (IOI15_towns)C++14
35 / 100
19 ms540 KiB
#include "towns.h"
#include<bits/stdc++.h>
using namespace std;

int dis0[200], disX[200], disY[200];

int hubDistance(int N, int sub) {
	int X = 1;
	for(int i=1; i<N; i++) {
		dis0[i] = getDistance(0, i);
		if(dis0[i] > dis0[X]) {
			X = i;
		}
	}
	int Y = 0;
	for(int i=0; i<N; i++) {
		if(i==X) continue;
		disX[i] = getDistance(X, i);
		if(disX[i] > disX[Y]) {
			Y = i;
		}
	}
	// diameter: X to Y
	for(int i=0; i<N; i++) {
		if(i==Y) continue;
		disY[i] = getDistance(Y, i);
	}
	int ans = 1e9;
	int C = 0;
	for(int i=0; i<N; i++) {
		if(i==X || i==Y) continue;
		int sum = (disX[Y] + disX[i] + disY[i]) / 2;
		int tmp = max(sum - disX[i], sum - disY[i]);
		if(tmp < ans) {
			C = i;
			ans = tmp;
		}
	}
	int sumC = (disX[Y] + disX[C] + disY[C]) / 2;
	if(sub==4) {
		int compX = 1, compY = 1, oth = N - 2;
		for(int i=0; i<N; i++) {
			if(i==X || i==Y) continue;
			int sum = (disX[Y] + disX[i] + disY[i]) / 2;
			if(sum - disY[i] < sumC - disY[C]) {
				compX++;
				oth--;
			} else if(sum - disX[i] < sumC - disX[C]) {
				compY++;
				oth--;
			}
		}
		if(compX <= N/2 && compY <= N/2 && oth <= N/2) return ans;
		else return -ans;
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...