#include "towns.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n;
int lim;
map<pair<int,int>,int> mp;
int query(int x, int y)
{
if(x==y)
return 0;
if(x>y)
swap(x,y);
if(!mp[{x,y}])
{
if(lim==0)while(1);lim--;
mp[{x,y}] = getDistance(x,y);
}
return mp[{x,y}];
}
vector<int> calc_dist(int src)
{
vector<int> dist(n);
for(int i=0;i<n;i++)
dist[i] = query(src,i);
return dist;
}
int hubDistance(int N, int sub)
{
mp.clear();
n = N;
if(sub==1 || sub==3) lim = n*(n-1)/2;
else if(sub==2 || sub==4 || sub==6) lim = 7*n/2;
else if(sub==5) lim = 5*n;
vector<int> dist0 = calc_dist(0);
int cap1=0;
for(int i=0;i<n;i++)
if(dist0[i]>dist0[cap1])
cap1=i;
vector<int> dist1 = calc_dist(cap1);
int cap2=0;
for(int i=0;i<n;i++)
if(dist1[i]>dist1[cap2])
cap2=i;
vector<int> dist2 = calc_dist(cap2);
int mnm = dist1[cap2];
vector<int> injos(n);
for(int i=0;i<n;i++)
{
injos[i] = dist1[i] + dist2[i] - dist1[cap2];
assert(injos[i]%2==0);
injos[i]/=2;
mnm = min(mnm, max(dist1[i], dist2[i]) - injos[i]);
}
bool gasit=0;
if(sub>2)
{
for(int i=0;i<n;i++)
{
if(max(dist1[i], dist2[i]) - injos[i] == mnm)
{
int cntst=0,cntmij=0,cntdr=0;
vector<int> vmij;
for(int j=0;j<n;j++)
{
if(dist1[j]-injos[j] < dist1[i]-injos[i])
{
cntst++;
}
else if(dist1[j]-injos[j] == dist1[i]-injos[i])
{
cntmij++;
vmij.push_back(j);
}
else
{
cntdr++;
}
}
if(max(cntst,cntdr) <= n/2)
{
//mai trebuie sa verific daca toti copii nodului ales din diametru sunt <=n/2
if(cntmij <= n/2)
{
gasit=1;
break;
}
}
}
}
for(int i=0;i<n;i++)
{
if(gasit)
break;
if(max(dist1[i], dist2[i]) - injos[i] == mnm)
{
int cntst=0,cntmij=0,cntdr=0;
vector<int> vmij;
for(int j=0;j<n;j++)
{
if(dist1[j]-injos[j] < dist1[i]-injos[i])
{
cntst++;
}
else if(dist1[j]-injos[j] == dist1[i]-injos[i])
{
cntmij++;
vmij.push_back(j);
}
else
{
cntdr++;
}
}
if(max(cntst,cntdr) <= n/2)
{
//mai trebuie sa verific daca toti copii nodului ales din diametru sunt <=n/2
if(cntmij <= n/2)
{
gasit=1;
break;
}
//random_shuffle(vmij.begin(),vmij.end());
int care=-1, cnt=0;
for(int x:vmij)
{
if(cnt==0)
{
care = x;
cnt = 1;
}
else if(query(care,x) == injos[x] + injos[care])
{
cnt--;
}
else
{
cnt++;
if(cnt > n/2)
break;
}
}
if(cnt<=n/2)
{
cnt=(int)vmij.size();
for(int x:vmij)
if(x!=care && query(care,x) == injos[x] + injos[care])
{
cnt--;
if(cnt <= n/2)
break;
}
}
if(cnt <= n/2)
{
gasit=1;
break;
}
}
}
}
}
if(!gasit)
mnm = -mnm;
return mnm;
}
# | 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... |