#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;
int getDistance(int i, int j);
ll calc(ll x, ll d1, ll y, ll d2, vector<vector<ll>> &dis, ll N)
{
ll i, r = max(d1, d2), d;
for (i = 0; i < N; i++)
{
if (x == i || y == i)
continue;
d = max(dis[x][i] - d1, dis[y][i] - d2);
r = max(d, r);
}
return r;
}
ll tam(ll x, ll d1, ll y, ll d2, vector<vector<ll>> &dis, ll N)
{
ll i, d, j, ac;
vector<set<ll>> un(3);
un[0].insert(x);
un[1].insert(y);
for (i = 0; i < N; i++)
{
d = max(dis[x][i] - d1, dis[y][i] - d2);
if(d!=dis[x][i] - d1)
un[0].insert(i);
else if(d!=dis[y][i] - d2)
un[1].insert(i);
else
un[2].insert(i);
}
ll ans = 0;
for (i = 0; i < sz(un); i++)
ans = max(ans, 1ll * sz(un[i]));
return ans;
}
int hubDistance(int N, int sub)
{
vector<vector<ll>> dis(N, vector<ll>(N, 0));
vector<vector<ll>> v;
ll i, j, k, d, R = LLONG_MAX, r;
vector<bool> vis(N, 0);
vis[0] = 1;
for (i = 1; i < N; i++)
dis[0][i] = dis[i][0] = getDistance(0, i);
ll ma = 0, mi = 0, mj = 0;
for (i = 0; i < N; i++)
{
if (ma < dis[i][0])
{
ma = dis[i][0];
mi = i;
}
}
vis[mi] = 1;
for (i = 0; i < N; i++)
if (mi != i)
dis[mi][i] = dis[i][mi] = getDistance(mi, i);
ma = 0;
for (i = 0; i < N; i++)
{
if (ma < dis[i][mi])
{
ma = dis[i][mi];
mj = i;
}
}
if (vis[mj] == 0)
{
for (i = 0; i < N; i++)
if (mj != i)
dis[mj][i] = dis[i][mj] = getDistance(mj, i);
}
i = mi;
j = mj;
for (k = 0; k < N; k++)
{
if(k==j||k==i)
continue;
d = (dis[i][j] + dis[i][k] - dis[j][k]) / 2;
r = calc(i, d, j, dis[i][j] - d, dis, N);
if (R > r)
{
R = r;
v.resize(0);
v.pb({i, d, j, dis[i][j] - d});
}
else if (R == r)
{
v.pb({i, d, j, dis[i][j] - d});
}
}
mi = tam(v[0][0], v[0][1], v[0][2], v[0][3], dis, N);
for (i = 1; i < sz(v); i++)
{
d = max(dis[v[i][0]][v[0][0]] - v[i][1], dis[v[i][2]][v[0][0]] - v[i][3]);
if (d == v[0][1])
continue;
mi = min(tam(v[i][0], v[i][1], v[i][2], v[i][3], dis, N), mi);
break;
}
if (mi > N / 2)
R = -R;
return R;
}
# | 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... |