제출 #1270349

#제출 시각아이디문제언어결과실행 시간메모리
1270349Faggi도시들 (IOI15_towns)C++20
35 / 100
10 ms580 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...