Submission #35111

# Submission time Handle Problem Language Result Execution time Memory
35111 2017-11-18T05:34:42 Z imeimi2000 Towns (IOI15_towns) C++14
100 / 100
36 ms 1220 KB
#include "towns.h"
#include <vector>
#include <algorithm>
 
using namespace std;
 
int n;
 
int d0[110];
int d1[110];
int dist[110];
 
bool checkSame(int i, int j) {
	return (getDistance(i, j) != dist[i] + dist[j]);
}
 
bool chk[110];
bool check(int p) {
	int l = 0, r = 0;
	vector<int> vt;
	for (int i = 0; i < n; ++i) {
		if (d1[i] - dist[i] < p) ++l;
		else if (d1[i] - dist[i] > p) ++r;
		else vt.push_back(i);
	}
	if (vt.empty() || l > n / 2 || r > n / 2) return false;
	int st, sum = 0;
	vector<int> gr;
	for (int i = 0; i < vt.size(); ++i) {
		if (sum == 0) {
			gr.push_back(st = i);
			sum = 1;
		}
		else {
			if (chk[i] = checkSame(vt[st], vt[i])) ++sum;
			else --sum;
		}
	}
	sum = (sum + (vt.size() - st)) / 2;
	for (int i = 1; i < gr.size(); ++i) {
		if (checkSame(vt[gr[i - 1]], vt[st])) sum += (gr[i] - gr[i - 1]) / 2;
		else {
			for (int j = gr[i - 1] + 1; j < gr[i]; ++j) {
				if (chk[j]) continue;
				if (checkSame(vt[j], vt[st])) ++sum;
			}
		}
	}
	return sum <= n / 2;
}
 
int hubDistance(int N, int sub) {
	n = N;
	int p = 0, d = 0;
	for (int i = 1; i < n; ++i) {
		d0[i] = getDistance(0, i);
		if (d < d0[i]) {
			d = d0[i];
			p = i;
		}
	}
	d1[0] = d;
	d1[p] = 0;
	for (int i = 1; i < n; ++i) {
		if (i == p) continue;
		d1[i] = getDistance(p, i);
		d = max(d1[i], d);
	}
	int r = 2e9;
	dist[0] = 0;
	dist[p] = 0;
	for (int i = 1; i < n; ++i) {
		if (i == p) continue;
		dist[i] = (d0[i] + d1[i] - d1[0]) / 2;
		r = min(r, abs(d - 2 * (d1[i] - dist[i])));
	}
	int ans = (d + r) / 2;
	if (check((d + r) / 2) || (r != 0 && check((d - r) / 2))) return ans;
	return -ans;
}

Compilation message

towns.cpp: In function 'bool check(int)':
towns.cpp:29:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < vt.size(); ++i) {
                    ^
towns.cpp:35:41: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
    if (chk[i] = checkSame(vt[st], vt[i])) ++sum;
                                         ^
towns.cpp:39:6: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
  sum = (sum + (vt.size() - st)) / 2;
      ^
towns.cpp:40:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 1; i < gr.size(); ++i) {
                    ^
towns.cpp: At global scope:
towns.cpp:52:28: warning: unused parameter 'sub' [-Wunused-parameter]
 int hubDistance(int N, int sub) {
                            ^
# Verdict Execution time Memory Grader output
1 Correct 36 ms 1220 KB Output is correct
2 Correct 16 ms 1220 KB Output is correct
3 Correct 0 ms 1220 KB Output is correct
4 Correct 26 ms 1220 KB Output is correct
5 Correct 23 ms 1220 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 1220 KB Output is correct
2 Correct 13 ms 1220 KB Output is correct
3 Correct 23 ms 1220 KB Output is correct
4 Correct 16 ms 1220 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 1220 KB Output is correct
2 Correct 16 ms 1220 KB Output is correct
3 Correct 0 ms 1220 KB Output is correct
4 Correct 19 ms 1220 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 1220 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 1220 KB Output is correct
2 Correct 19 ms 1220 KB Output is correct
3 Correct 19 ms 1220 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 1220 KB Output is correct
2 Correct 19 ms 1220 KB Output is correct
3 Correct 26 ms 1220 KB Output is correct