Submission #58495

# Submission time Handle Problem Language Result Execution time Memory
58495 2018-07-18T03:48:15 Z E869120 Towns (IOI15_towns) C++14
35 / 100
43 ms 6992 KB
#include "towns.h"
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;

int Weight[111][111], Dist[111][111], NN, TT, SB, cu[111], cv[111], hub[111], Queries = 0;

//int getDistance(int p1, int p2) { Queries++; return Weight[p1][p2]; }

int getDist(int p1, int p2) {
	if (p1 == p2) return 0;
	if (p1 > p2) swap(p1, p2);
	if (Dist[p1][p2] == 0) {
		Dist[p1][p2] = getDistance(p1, p2) + 1;
	}
	return Dist[p1][p2] - 1;
}

int hubDistance(int N, int sub) {
	for (int i = 0; i < 111; i++) { for (int j = 0; j < 111; j++) Dist[i][j] = 0; }

	int maxn1 = 0, u = 0;
	for (int i = 0; i < N; i++) { int V = getDist(0, i); if (V > maxn1) { maxn1 = V; u = i; } }
	int maxn2 = 0, v = 0;
	for (int i = 0; i < N; i++) { int V = getDist(u, i); if (V > maxn2) { maxn2 = V; v = i; } cu[i] = V; }

	for (int i = 0; i < N; i++) cv[i] = getDist(v, i);

	int ret = (1 << 30), maxid = 0;
	for (int i = 0; i < N; i++) { if (abs(cu[i] - cv[i]) < ret) { ret = abs(cu[i] - cv[i]); maxid = i; } }

	int p[3] = { 0,0,0 }, R = cu[maxid] - cv[maxid], S = (maxn2 + ret) / 2; vector<int>vec;
	for (int i = 0; i < N; i++) {
		if (cu[i] - cv[i] < R) p[0]++;
		if (cu[i] - cv[i] == R) { p[1]++; vec.push_back(i); }
		if (cu[i] - cv[i] > R) p[2]++;
	}
	if (sub == 1 || sub == 2 || sub == 4) {
		if (p[0] >(N / 2) || p[1] > (N / 2) || p[2] >(N / 2)) return -S;
		return S;
	}
	if (sub == 3) {
		if (p[0] > (N / 2) || p[2] > (N / 2)) return -S;

		for (int i = 0; i < vec.size(); i++) hub[vec[i]] = max(cu[vec[i]], cv[vec[i]]) - S;

		int deg[111]; for (int i = 0; i < 111; i++) deg[i] = 0;

		// vec は同じやつのリスト
		for (int i = 0; i < vec.size(); i++) {
			for (int j = 0; j < vec.size(); j++) {
				int Z = getDist(vec[i], vec[j]);
				if (Z == hub[vec[i]] + hub[vec[j]]) continue;
				deg[i]++; deg[j]++;
			}
		}
		for (int i = 0; i < N; i++) {
			if (deg[i] / 2 > (N / 2)) return -S;
		}
		return S;
	}
	return 0;
}

Compilation message

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:47:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < vec.size(); i++) hub[vec[i]] = max(cu[vec[i]], cv[vec[i]]) - S;
                   ~~^~~~~~~~~~~~
towns.cpp:52:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < vec.size(); i++) {
                   ~~^~~~~~~~~~~~
towns.cpp:53:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int j = 0; j < vec.size(); j++) {
                    ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 35 ms 1016 KB Output is correct
2 Correct 27 ms 1448 KB Output is correct
3 Correct 2 ms 1572 KB Output is correct
4 Correct 27 ms 2296 KB Output is correct
5 Correct 28 ms 2808 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 21 ms 3348 KB Output is correct
2 Correct 31 ms 3812 KB Output is correct
3 Correct 31 ms 4260 KB Output is correct
4 Correct 43 ms 4904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 22 ms 5248 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 31 ms 6100 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 23 ms 6536 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 21 ms 6992 KB Output isn't correct
2 Halted 0 ms 0 KB -