이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "towns.h"
#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
using namespace std;
int n, nodes;
int x, a, b;
int distancia[5][120];
int hubDistance(int N, int sub) {
n = N;
nodes = n;
x = 0;
distancia[0][x] = 0;
int masLejano = 0;
for(int i = 0 ; i < N ; i ++){
if(i == x)continue;
distancia[0][i] = getDistance(x, i);
if(distancia[0][i] > distancia[0][masLejano]){
masLejano = i;
}
}
a = masLejano; // A encontrado, buscando B
masLejano = a;
distancia[1][a] = 0;
distancia[1][x] = distancia[0][a];
for(int i = 0 ; i < N ; i ++){
if(i == x or i == a)continue;
distancia[1][i] = getDistance(a, i);
if(distancia[1][i] > distancia[1][masLejano])masLejano = i;
}
if(distancia[0][a] > distancia[1][masLejano]){
b = x;
for(int i = 0 ; i < N ; i ++){
distancia[2][i] = distancia[0][i];
}
x = 0;
while(x == a or x == b)x++;
distancia[0][a] = distancia[1][x];
distancia[0][b] = distancia[2][x];
distancia[0][x] = 0;
for(int i = 0 ; i < N ; i ++){
if(i == a or i == b or i == x)continue;
distancia[0][i] = getDistance(x, i);
}
}else{
b = masLejano;
distancia[2][a] = distancia[1][b];
distancia[2][x] = distancia[0][b];
for(int i = 0 ; i < N ; i ++){
if(i == a or i == b or i == x)continue;
distancia[2][i] = getDistance(b, i);
}
}
set<int>st;
vector<int>listaDist, caminos, hubs;
map<int, int>cuenta;
for(int i = 0 ; i < n ; i ++){
if(i == a or i == b)continue;
st.insert((distancia[2][a]+distancia[2][i]-distancia[1][i])/2);
if(cuenta.count((distancia[2][a]+distancia[2][i]-distancia[1][i])/2))cuenta[(distancia[2][a]+distancia[2][i]-distancia[1][i])/2]++;
else cuenta[(distancia[2][a]+distancia[2][i]-distancia[1][i])/2] = 1;
}
for(auto i : st)listaDist.pb(i);
listaDist.pb(distancia[2][a]);
int anterior = 0;
int minimum = INT_MAX;
for(int i = 0 ; i < n ; i ++){
caminos.pb(listaDist[i]-anterior);
minimum = min(minimum, max(listaDist[i], distancia[2][a]-listaDist[i]));
anterior = listaDist[i];
}
int cuentaAcum = 0;
for(int i = 0 ; i < n ; i ++){
if(i == 0)cuenta[listaDist[i]]++;
if(max(listaDist[i], distancia[2][a]-listaDist[i]) == minimum){
hubs.pb(i);
//cout << "hub " << minimum << " : " << cuentaAcum << " " << cuenta[listaDist[i]] << " " << n-(cuenta[listaDist[i]]+cuentaAcum) << endl;
if(cuentaAcum <= n/2 and cuenta[listaDist[i]] <= n/2 and n-(cuenta[listaDist[i]]+cuentaAcum) <= n/2){
return minimum;
}
}
cuentaAcum += cuenta[listaDist[i]];
}
return -minimum;
/*
cout << "X = " << x << endl;
for(int i = 0 ; i < N ; i++){
cout << "dist with " << i << " = " << distancia[0][i] << endl;
}
cout << "A = " << a << endl;
for(int i = 0 ; i < N ; i++){
cout << "dist with " << i << " = " << distancia[1][i] << endl;
}
cout << "B = " << b << endl;
for(int i = 0 ; i < N ; i++){
cout << "dist with " << i << " = " << distancia[2][i] << endl;
}
*/
//for(auto i : listaDist)cout << i << " ";
//cout << endl;
}
컴파일 시 표준 에러 (stderr) 메시지
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:11:28: warning: unused parameter 'sub' [-Wunused-parameter]
11 | int hubDistance(int N, int sub) {
| ~~~~^~~
# | 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... |