Submission #16580

#TimeUsernameProblemLanguageResultExecution timeMemory
16580gs14004Towns (IOI15_towns)C++14
35 / 100
28 ms1720 KiB
#include "towns.h" #include <cstring> #include <algorithm> #include <stack> #include <vector> using namespace std; typedef pair<int,int> pi; int dp[150][150]; int dist(int s, int e){ if(s == e) return 0; if(s > e) swap(s,e); if(~dp[s][e]) return dp[s][e]; return dp[s][e] = getDistance(s, e); } vector<pi> v; int p, q, val; bool diff(int s, int e){ return (val + dist(s, e)) == dist(s, p) + dist(q, e); } stack<int> stk; int st; int solve(int s, int e){ if(st == 2) return 0; if(st == 4) return e - s + 1; while(!stk.empty()) stk.pop(); for(int i=s; i<=e; i++){ if(stk.empty()){ stk.push(v[i].second); } else if(diff(stk.top(), v[i].second)){ stk.pop(); } else{ stk.push(v[i].second); } } if(stk.empty()) return 0; int cnt = 0; for(int i=s; i<=e; i++){ if(!diff(stk.top(), i)) cnt++; } return cnt; } int hubDistance(int N, int sub) { st = sub; v.clear(); memset(dp,-1,sizeof(dp)); p = -1, val = -1, q = -1; for(int i=1; i<N; i++){ if(val < dist(0, i)){ val = dist(0, i); p = i; } } val = -1; for(int i=0; i<N; i++){ if(val < dist(p, i)){ val = dist(p, i); q = i; } } for(int i=0; i<N; i++){ int fl = dist(p, i) - dist(q, i) + val; v.push_back(pi(fl / 2, i)); } sort(v.begin(), v.end()); int R = val; int hmin = 1e9; for(int i=0; i<v.size(); ){ int e = i; while(e < v.size() && v[e].first == v[i].first) e++; int tmp = max(val - v[i].first, v[i].first); if(R > tmp){ R = tmp; hmin = 1e9; } if(R == tmp){ int hub = max(solve(i, e-1), max(i, (int)v.size() - e)); hmin = min(hmin, hub); } i = e; } if(hmin > 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...