#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(vector<int> Mid) {
    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) {
                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();
    }
    return (!Bucket.empty());
}
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;
    if (cached0[nodeA] == cached0[nodeB]) disA = diameter/2;
    else {
        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(dA - (diameter*0.5)) < abs(disA - (diameter * 0.5))) 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);
    }
    return solve(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... |