이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "towns.h"
#include<bits/stdc++.h>
using namespace std;
using ll = int;
#define pll pair <ll,ll>
#define fi first
#define se second
#define MP make_pair
#define sz(a) (ll((a).size()))
#define BIT(mask,i) (((mask) >> (i))&1)
#define MASK(i) (1LL << (i))
const ll MAXN = 120;
ll dist[2][MAXN];
ll sus[MAXN];
ll n;
ll get_dist(ll u,ll d[]){
ll res = 0;
for (ll i = 0;i < n;i ++){
if (i == u){
d[u] = 0;
}
else{
d[i] = getDistance(i,u);
if (d[res] < d[i])res = i;
}
}
return res;
}
int hubDistance(int N, int sub) {
n=N;
ll a = get_dist(0,dist[0]);
ll b = get_dist(a,dist[1]);
ll res = 1e9;
ll cap = (dist[0][b] + dist[1][b] + dist[0][a])/2-dist[0][b];
ll diameter = dist[1][b];
vector <ll> val;
vector <vector <ll> > path;
for (ll i = 0;i < n;i ++){
ll d = min((dist[0][i] + dist[1][i] + dist[0][a])/2-dist[0][i],cap+1);
sus[i] = (dist[0][i] + dist[1][i] + dist[0][a])/2-dist[0][a];
val.push_back(d);
}
sort(val.begin(),val.end());
val.resize(unique(val.begin(),val.end())-val.begin());
path.resize(sz(val));
for (ll i = 0;i < n;i ++){
ll d = min((dist[0][i] + dist[1][i] + dist[0][a])/2-dist[0][i],cap+1);
path[lower_bound(val.begin(),val.end(),d)-val.begin()].push_back(i);
}
vector <ll> id;
for (ll i = 0;i < sz(val);i ++){
ll bruh = max(diameter - val[i],val[i]);
if (bruh < res){
id = {i};
res = bruh;
}
else if (bruh == res)id.push_back(i);
}
ll root = -1;
for (auto x:id){
ll l,r;
l = r = 0;
for (ll j = 0;j < x;j ++)l += sz(path[j]);
for (ll j = x+1;j < sz(val);j ++)r += sz(path[j]);
if (l*2>n||r*2>n)continue;
if (sz(path[x]) * 2 > n)root = x;
else return res;
}
if (root==-1)return -res;
auto same = [&](ll x,ll y){
return getDistance(x,y) < sus[x] + sus[y];
};
vector <ll> bucket;
vector <ll> lst;
for (auto x:path[root]){
if (lst.empty())lst.push_back(x);
else if (same(x,lst.back()))bucket.push_back(x);
else {
lst.push_back(x);
if (sz(bucket)){
lst.push_back(bucket.back());
bucket.pop_back();
}
}
}
ll pp = lst.back();
while (sz(lst)){
if (same(pp,lst.back())){
if (sz(lst)==1){
bucket.push_back(lst.back());
}
else{
lst.pop_back();
lst.pop_back();
}
}
else{
lst.pop_back();
if (sz(bucket))bucket.pop_back();
else {
lst.clear();
bucket.clear();
break;
}
}
}
ll big_comp = (sz(path[root])+sz(bucket))/2;
if (big_comp*2>n)res = -res;
return res;
}
컴파일 시 표준 에러 (stderr) 메시지
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:30:28: warning: unused parameter 'sub' [-Wunused-parameter]
30 | 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... |