Submission #1258542

#TimeUsernameProblemLanguageResultExecution timeMemory
1258542kl0989e도시들 (IOI15_towns)C++20
48 / 100
14 ms328 KiB
#include "towns.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pi pair<int, int> #define pl pair<ll, ll> #define vi vector<int> #define vl vector<ll> #define fi first #define se second #define pb push_back #define all(x) (x).begin(),(x).end() const int maxn=110; map<pi,int> mem; int remq; int query(int i, int j) { if (mem[{i,j}]) { return mem[{i,j}]; } if (mem[{j,i}]) { return mem[{j,i}]; } if (i==j) { return 0; } remq--; return mem[{i,j}]=getDistance(i,j); } int hubDistance(int n, int sub) { if (sub==5) { remq=5*n; } else { remq=(7*n+1)/2; } /*for (int i=0; i<n; i++) { dist[i][i]=0; for (int j=i+1; j<n; j++) { dist[i][j]=getDistance(i,j); dist[j][i]=dist[i][j]; } } int ans=2e9; for (int i=0; i<n; i++) { for (int j=i+1; j<n; j++) { map<int,int> dst; for (int k=0; k<n; k++) { if (k==i || k==j) { continue; } dst[(dist[i][k]+dist[i][j]-dist[j][k])/2]=max(dst[(dist[i][k]+dist[i][j]-dist[j][k])/2],(dist[i][k]+dist[j][k]-dist[i][j])/2); } int val=0; int prv=0; map<int,int> nw; for (auto pt=dst.begin(); pt!=dst.end(); pt++) { val+=pt->fi-prv; prv=pt->fi; nw[pt->fi]=max(pt->se,val); val=nw[pt->fi]; } prv=dist[i][j]; val=0; auto pt=dst.end(); do { pt--; val+=prv-pt->fi; prv=pt->fi; val=max(val,pt->se); pt->se=max(val,nw[pt->fi]); ans=min(ans,pt->se); } while (pt!=dst.begin()); } } bool has=0; for (int i=0; i<n && !has; i++) { for (int j=i+1; j<n && !has; j++) { map<int,int> dst; map<int,vi> adj; for (int k=0; k<n; k++) { if (k==i || k==j) { continue; } dst[(dist[i][k]+dist[i][j]-dist[j][k])/2]=max(dst[(dist[i][k]+dist[i][j]-dist[j][k])/2],(dist[i][k]+dist[j][k]-dist[i][j])/2); adj[(dist[i][k]+dist[i][j]-dist[j][k])/2].pb(k); } int val=0; int prv=0; int sum=1; map<int,int> nw; map<int,int> cnts; for (auto pt=dst.begin(); pt!=dst.end(); pt++) { val+=pt->fi-prv; prv=pt->fi; nw[pt->fi]=max(pt->se,val); val=nw[pt->fi]; cnts[pt->fi]=sum; sum+=adj[pt->fi].size(); } sum=1; prv=dist[i][j]; val=0; auto pt=dst.end(); do { pt--; val+=prv-pt->fi; prv=pt->fi; val=max(val,pt->se); pt->se=max(val,nw[pt->fi]); cnts[pt->fi]=max(sum,cnts[pt->fi]); sum+=adj[pt->fi].size(); if (ans==pt->se) { bool ok=1; ok&=(cnts[pt->fi]<=n/2); for (auto l:adj[pt->fi]) { int tcnt=0; for (auto m:adj[pt->fi]) { if (dist[l][m]!=(dist[i][l]+dist[j][l]-dist[i][j])/2+(dist[i][m]+dist[j][m]-dist[i][j])/2) { tcnt++; } } ok&=tcnt<=n/2; } has|=ok; } } while (pt!=dst.begin()); } } return (has?ans:-ans);*/ mem.clear(); int i=1; for (int k=0; k<n; k++) { if (query(0,k)>query(0,i)) { i=k; } } int j=0; for (int k=0; k<n; k++) { if (query(i,k)>query(i,j)) { j=k; } } int ans=2e9; vi fromi; map<int,int> dst; for (int k=0; k<n; k++) { if (k==i || k==j) { continue; } dst[(query(i,k)+query(i,j)-query(j,k))/2]=max(dst[(query(i,k)+query(i,j)-query(j,k))/2],(query(i,k)+query(j,k)-query(i,j))/2); } int val=0; int prv=0; map<int,int> nw; for (auto pt=dst.begin(); pt!=dst.end(); pt++) { val+=pt->fi-prv; prv=pt->fi; nw[pt->fi]=max(pt->se,val); val=nw[pt->fi]; } prv=query(i,j); val=0; auto pt=dst.end(); do { pt--; val+=prv-pt->fi; prv=pt->fi; val=max(val,pt->se); pt->se=max(val,nw[pt->fi]); if (pt->se<ans) { ans=pt->se; fromi.clear(); } if (pt->se==ans) { fromi.pb(pt->fi); } } while (pt!=dst.begin()); bool ok=0; for (auto t:fromi) { int a=0,b=0,c=0; vi bb; for (int k=0; k<n; k++) { int dist=(query(i,j)+query(i,k)-query(j,k))/2; if (dist<t) { a++; } else if (dist==t) { b++; bb.pb(k); } else { c++; } } if (max(max(a,b),c)<=n/2) { ok=1; break; } if (max(a,c)<=n/2) { mt19937_64 rnd(42); shuffle(all(bb),rnd); while (remq) { int l=bb.back(); bb.pop_back(); int tcnt=1; for (int k=0; tcnt+bb.size()-k>n/2 && k<bb.size() && remq; k++) { int m=bb[k]; if (query(l,m)!=(query(i,l)+query(j,l)-query(i,j))/2+(query(i,m)+query(j,m)-query(i,j))/2) { tcnt++; bb.erase(bb.begin()+k); k--; } } if (tcnt>n/2) { break; } if (remq==0 || bb.size()<=n/2) { ok=1; break; } } if (ok) { break; } } } return (ok?ans:-ans); }
#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...