Submission #587581

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

int dis0[200], disX[200], disY[200];
vector<int> mid, mid2;
int X, Y;

bool checkdiff(int a, int b) {
	int ad = (disX[Y] + disX[a] + disY[a]) / 2 - disX[Y];
	int bd = (disX[Y] + disX[b] + disY[b]) / 2 - disX[Y];
	if(getDistance(a, b) == ad+bd) return true;
	return false;
}

int hubDistance(int N, int sub) {
	X = 1;
	for(int i=1; i<N; i++) {
		dis0[i] = getDistance(0, i);
		if(dis0[i] > dis0[X]) {
			X = i;
		}
	}
	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;
	mid.clear();
	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--;
		} else mid.push_back(i);
	}
	if(sub <= 2) return ans;
	if(sub==4) {
		if(compX <= N/2 && compY <= N/2 && oth <= N/2) return ans;
		else return -ans;
	} else if(sub >= 3) {
		mid2 = mid;
		while(mid.size() >= 2) {
			if(checkdiff(mid[mid.size()-1], mid[mid.size()-2])) {
				mid.pop_back();
				mid.pop_back();
			} else {
				mid.pop_back();
			}
		}
		if(mid.size() == 1) {
			int cnt = 0;
			for(int i:mid2) {
				if(!checkdiff(i, mid[0])) {
					cnt++;
				}
			}
			if(cnt > N/2 || compX > N/2 || compY > N/2) return -ans;
			else return ans;
		}
		if(compX > N/2 || compY > N/2) return -ans;
		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...