Submission #1273132

#TimeUsernameProblemLanguageResultExecution timeMemory
1273132vtnooTowns (IOI15_towns)C++20
13 / 100
9 ms1848 KiB
#include "towns.h" #include <bits/stdc++.h> using namespace std; const int MAXN=110; int D[MAXN][MAXN]; int hubDistance(int N, int sub) { memset(D, -1, sizeof(D)); for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if(i==j)D[i][j]=0; if(D[i][j]==-1){ D[i][j]=getDistance(i,j); D[j][i]=D[i][j]; } } } vector<int> q(N); for(int i=1;i<N;i++){ q[i]=D[0][i]; } int a=max_element(q.begin(), q.end())-q.begin(); vector<int> w(N); for(int i=0;i<N;i++){ if(i==a)continue; w[i]=D[a][i]; } int b=max_element(w.begin(), w.end())-w.begin(); vector<int> e(N); for(int i=0;i<N;i++){ if(i==b)continue; e[i]=D[b][i]; } vector<int> r(N, 1e9), h(N); map<int, vector<int>> mp; for(int i=0;i<N;i++){ if(i==a||i==b)continue; int d1=((e[a]+e[i])-w[i])/2; int d2=((e[a]+w[i])-e[i])/2; mp[d1].push_back(i); h[i]=e[i]-d1; r[i]=max(d1, d2); } int R=*min_element(r.begin(), r.end()); /* if(sub<=2)return R; */ for(auto [cand, v]:mp){ int pref=0; for(auto [key, arr]:mp){ if(key==cand)break; pref+=arr.size(); } vector<int> treeSizes; vector<bool> vis(N, false); for(int i=0;i<(int)v.size();i++){ int x=v[i]; if(vis[x])continue; vis[x]=true; int currTree=1; for(int j=0;j<(int)v.size();j++){ int y=v[j]; if(vis[y])continue; if(D[x][y]!=h[x]+h[y]){ vis[y]=true; currTree++; } } treeSizes.push_back(currTree); } bool ok=true; int sum=0; for(int i=0;i<(int)treeSizes.size();i++){ if(treeSizes[i]>N/2){ ok=false; } sum+=treeSizes[i]; } if(ok&&pref<=N/2&&N-pref-1-sum<=N/2){ return 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...