This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//by szh
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define pb push_back
#define debug(x) cerr<<#x<<"="<<x<<endl
#define pq priority_queue
#define inf 0x3f
#define rep(i,a,b) for (int i=a;i<(b);i++)
#define MP make_pair
#define SZ(x) (int(x.size()))
#define ll long long
#define mod 1000000007
#define ALL(x) x.begin(),x.end()
void inc(int &a,int b) {a=(a+b)%mod;}
void dec(int &a,int b) {a=(a-b+mod)%mod;}
int lowbit(int x) {return x&(-x);}
ll p0w(ll base,ll p) {ll ret=1;while(p>0){if (p%2ll==1ll) ret=ret*base%mod;base=base*base%mod;p/=2ll;}return ret;}
#include "towns.h"
const int maxn = 111;
int u=0,R;
int dis[maxn][maxn];
int getdis(int x,int y) {
if (x==y) return 0;
if (dis[x][y]==-1) dis[x][y] = dis[y][x] = getDistance(x,y);
return dis[x][y];
}
bool samebranch(int x,int y) {
return getdis(x,u) + getdis(y,u) - getdis(x,y) > 2*R;
}
int hubDistance(int N, int sub) {
memset(dis,-1,sizeof(dis));
rep(i,0,N) if (getdis(0,i) > getdis(0,u)) u = i;
int diam = 0;
rep(i,0,N) diam = max(diam,getdis(i,u));
int ans = mod;
//find centre
vector <pii> node;
rep(i,0,N) {
int disi0 = getdis(i,0), disu0 = getdis(u,0), disui = getdis(u,i);
int cur = (disu0 + disui - disi0)/2;
assert((disu0+disui-disi0)%2==0);
node.pb({cur,i});
ans = min(ans,max(cur,diam-cur));
}
int cnt = 0;
sort(ALL(node));
while (max(node.back().fi,diam-node.back().fi)!=ans) cnt++,node.pop_back();
if (cnt*2>N) return -ans;
cnt = 0;
reverse(ALL(node));
while (max(node.back().fi,diam-node.back().fi)!=ans) cnt++,node.pop_back();
if (cnt*2>N) return -ans;
vector <pii> alive,dead;
R = node[0].fi;
for (auto it:node) alive.pb({it.se,1});
while (1) {
if (SZ(alive)==1) {
int tmp = alive[0].se;
if (tmp*2>N) return -ans;
for (auto it:dead) if (samebranch(it.fi,alive[0].fi)) {
tmp+=it.se;
if (tmp*2>N) return -ans;
}
return ans;
}
if (SZ(alive)%2==1) {
dead.pb(alive.back());
alive.pop_back();
}
if (alive.empty()) return ans;
vector <pii> tmp;
while (!alive.empty()) {
auto it1 = alive.back();alive.pop_back();
auto it2 = alive.back();alive.pop_back();
if (samebranch(it1.fi,it2.fi)) tmp.pb({it1.fi,it1.se + it2.se});
else dead.pb(it1),dead.pb(it2);
}
alive = tmp;
}
}
Compilation message (stderr)
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:40:28: warning: unused parameter 'sub' [-Wunused-parameter]
40 | 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... |