답안 #835504

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
835504 2023-08-23T15:18:04 Z Valaki2 도시들 (IOI15_towns) C++14
26 / 100
14 ms 852 KB
#include "towns.h"
#include <bits/stdc++.h>
using namespace std;

const int inf = 1e6 + 42;

int n;
vector<vector<int> > storedist;

int dist(int a, int b) {
	if(storedist[a][b] != -1) {
		return storedist[a][b];
	}
	return storedist[a][b] = storedist[b][a] = getDistance(a - 1, b - 1);
}

void reset() {
	storedist.clear();
	storedist.assign(1 + n, vector<int> (1 + n, -1));
	for(int i = 1; i <= n; i++) {
		storedist[i][i] = 0;
	}
}

int hubDistance(int N, int sub) {
	n = N;
	reset();
	int ans = inf;
	int X = 1;
	for(int i = 2; i <= n; i++) {
		if(dist(1, i) > dist(1, X)) {
			X = i;
		}
	}
	int Y = X;
	for(int i = 1; i <= n; i++) {
		if(dist(X, i) > dist(X, Y)) {
			Y = i;
		}
	}
	int diam = dist(X, Y);
	for(int i = 1; i <= n; i++) {
		int a = dist(i, X);
		int b = dist(i, Y);
		int from = (a + b - diam) / 2;
		ans = min(ans, max(a - from, b - from));
	}
	bool from_X = false, from_Y = false;
	for(int i = 1; i <= n; i++) {
		if(i == X || i == Y) {
			continue;
		}
		int a = dist(i, X);
		int b = dist(i, Y);
		int from = (a + b - diam) / 2;
		if(a - from == ans) {
			from_X = true;
		} else if(b - from == ans) {
			from_Y = true;
		}
	}
	vector<int> Z = {X, Y};
	int idx = 0;
	if(from_Y) {
		idx = 1;
	}
	vector<set<int> > s(2);
	vector<bool> balanced(2, true);
	for(int j = 0; j < 2; j++) {
		int less_cnt = 0, more_cnt = 0;
		for(int i = 1; i <= n; i++) {
			int a = dist(i, X);
			int b = dist(i, Y);
			int from = (a + b - diam) / 2;
			vector<int> d = {a - from, b - from};
			if(d[j] == ans) {
				s[j].insert(i);
			}
			if(d[j] < ans) {
				less_cnt++;
			}
			if(d[j] > ans) {
				more_cnt++;
			}
		}
		if(less_cnt > n / 2 || more_cnt > n / 2) {
			balanced[j] = false;
		}
	}
	/*if(from_X && from_Y) {
		return ans;
	}*/
	vector<int> di(1 + n, 0);
	for(int k = 0; k < 2; k++) {
		for(int i : s[k]) {
			int a = dist(i, X);
			int b = dist(i, Y);
			int from = (a + b - diam) / 2;
			di[i] = from;
		}
		for(int i : s[k]) {
			int cnt = 0;
			for(int j : s[k]) {
				int dij = dist(i, j);
				if(dij < di[i] + di[j]) {
					cnt++;
				}
			}
			if(cnt > n / 2) {
				balanced[k] = false;
			}
		}
	}
	if(!balanced[0] && !balanced[1]) {
		return -ans;
	}
	return ans;
}

Compilation message

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:48:7: warning: variable 'from_X' set but not used [-Wunused-but-set-variable]
   48 |  bool from_X = false, from_Y = false;
      |       ^~~~~~
towns.cpp:63:6: warning: variable 'idx' set but not used [-Wunused-but-set-variable]
   63 |  int idx = 0;
      |      ^~~
towns.cpp:25:28: warning: unused parameter 'sub' [-Wunused-parameter]
   25 | int hubDistance(int N, int sub) {
      |                        ~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 340 KB Output is correct
2 Correct 9 ms 340 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 14 ms 340 KB Output is correct
5 Correct 14 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 340 KB Output is correct
2 Correct 14 ms 852 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 14 ms 852 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -