#include "towns.h"
#include <bits/stdc++.h>
#define maxn 115
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
int nodeA = 0, nodeB = 0, diameter = 0;
int cached0[maxn], cachedA[maxn];
int cmp(int x, int y) {
int x_plus_y = getDistance(x, y),
x_minus_y = cachedA[x] - cachedA[y],
disX = (x_plus_y + x_minus_y) / 2;
int a_plus_zero = cachedA[0],
a_minus_zero = cachedA[x] - cached0[x],
disA = (a_plus_zero + a_minus_zero) / 2,
distance_to_mid = cachedA[x] - disA;
return (disX < distance_to_mid);
}
int solve(int N, vector<int> Mid) {
if (Mid.size() <= (N/2)) return 0;
int cnt = 0;
vector<int> Lis, Bucket; //orz fischer
Lis.emplace_back(Mid[0]);
for (int i = 1; i < Mid.size(); i++) {
int u = Mid[i];
if (cmp(u, Lis.back())) Bucket.emplace_back(u);
else {
Lis.emplace_back(u);
if (!Bucket.empty()) {
Lis.emplace_back(Bucket.back());
Bucket.pop_back();
}
}
}
int candidate = Lis.back();
while (!Lis.empty()) {
if (cmp(candidate, Lis.back())) {
if (Lis.size() >= 2) {
++cnt;
Lis.pop_back(); Lis.pop_back();
} else {
Bucket.emplace_back(Lis.back());
Lis.pop_back();
}
continue;
}
if (Bucket.empty()) return 0;
Bucket.pop_back();
Lis.pop_back();
++cnt;
}
cnt += Bucket.size();
return (cnt > (N/2));
}
int hubDistance(int N, int sub) {
nodeA = 0; nodeB = 0; int mx = -1;
for (int i = 1; i < N; i++) {
int t = cached0[i] = getDistance(0, i);
if (mx < t) {
nodeA = i;
mx = t;
}
}
cachedA[nodeA] = 0; cachedA[0] = mx;
for (int i = 1; i < N; i++) {
if (i == nodeA) continue;
int t = cachedA[i] = getDistance(nodeA, i);
if (mx < cachedA[i]) {
mx = cachedA[i];
nodeB = i;
}
}
diameter = mx;
int disA = 0;
for (int i = 1; i < N; i++)
if (i != nodeA) {
int A_minus_zero = cachedA[i] - cached0[i],
A_plus_zero = cachedA[0];
int dA = (A_minus_zero+A_plus_zero) / 2;
if (abs(2*dA - (diameter)) < abs(2*disA - (diameter))) disA = dA;
}
int ans = max(disA, diameter - disA);
int szL = 1, szR = 1;
vector<int> Mid;
for (int i = 1; i < N; i++)
if (i != nodeA) {
int A_minus_zero = cachedA[i] - cached0[i],
A_plus_zero = cachedA[0];
int dA = (A_minus_zero+A_plus_zero) / 2;
if (dA < disA) ++szL;
else if (dA > disA) ++szR;
else Mid.emplace_back(i);
}
if (szL > (N/2) || szR > (N/2)) return -ans;
return solve(N, Mid) ? -ans : ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |