Submission #1147547

#TimeUsernameProblemLanguageResultExecution timeMemory
1147547alexddTowns (IOI15_towns)C++20
38 / 100
1096 ms584 KiB
#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--; if(cnt==0) { care = x; cnt = 1; } } 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 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...