제출 #1273157

#제출 시각아이디문제언어결과실행 시간메모리
1273157vtnoo도시들 (IOI15_towns)C++20
26 / 100
11 ms1856 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]; } } } int b=0, c=0, s1=-1, s2=-1; for(int i=0;i<N;i++){ if(D[0][i]>s1){ b=i; s1=D[0][i]; } } for(int i=0;i<N;i++){ if(D[b][i]>s2){ c=i; s2=D[b][i]; } } int diam=D[b][c], r=1e9; map<int, vector<int>> mp; vector<int> h(N); for(int i=0;i<N;i++){ int to_diam=(D[i][b]+D[b][c]-D[i][c])/2; int mx=max(diam-to_diam, to_diam); r=min(r, mx); mp[to_diam].push_back(i); h[i]=D[i][b]-to_diam; } //cout<<b<<" "<<c<<endl; /* for(int i=0;i<N;i++){ cout<<h[i]<<" "; } cout<<endl; */ bool exist=false; int lef=N, rig=0; for(auto [cand,v]:mp){ lef-=v.size(); if((cand==r||diam-cand==r)&&(lef<=N/2&&rig<=N/2)){ if(v.size()<=N/2)exist=true; vector<int> treeSizes; int maxSubtree=0; for(auto x:v){ int curSubtree=0; for(auto y:v){ if(h[x]+h[y]!=D[x][y]){ curSubtree++; } } maxSubtree=max(maxSubtree, curSubtree); } if(maxSubtree<=N/2){ exist=true; } } rig+=v.size(); } if(exist)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...