Submission #1037784

#TimeUsernameProblemLanguageResultExecution timeMemory
1037784antonTowns (IOI15_towns)C++17
35 / 100
15 ms536 KiB
#include "towns.h" #include<bits/stdc++.h> using namespace std; #define pii pair<int, int> const int MAX_N= 110; struct Edge{ int origin, dest; int l; Edge(){}; Edge(int _or, int _de, int _l){ l = _l; origin = _or; dest = _de; } }; int distances[MAX_N][MAX_N]; bool queried[MAX_N][MAX_N]; int getDist(int a, int b){ if(a == b){ return 0; } if(!queried[a][b]){ distances[a][b] = getDistance(a, b); distances[b][a] = distances[a][b]; queried[a][b] = true; queried[b][a] = true; } return distances[a][b]; } int n; map<int, int> get_pos(int a, int b){ map<int, int> cats; for(int i = 0; i<n; i++){ cats[((getDist(a, i)-getDist(b, i))+getDist(a, b))/2]++; } return cats; } int find_pos(pair<int, int> axis, int i){ int a = axis.first, b= axis.second; return ((getDist(a, i)-getDist(b, i))+getDist(a, b))/2; } struct Base{ pii axis; int rootPos; Base(pii a, int rp){ axis = a; rootPos = rp; } }; bool belongs(Base b, int i){ return find_pos(b.axis, i)> b.rootPos; } int find_sz_big(pair<int, int> axis, int root_pos){ vector<Base> cur_group = {}; for(int i = 0; i<n; i++){ if(i!= axis.second && i!=axis.first){ if(cur_group.size()== 0 || belongs(cur_group[0], i)){ cur_group.push_back(Base({axis.first, i}, root_pos)); } else{ cur_group.pop_back(); } } } if(cur_group.size() == 0){ return 0; } Base cand= cur_group.back(); int maxSZ = 0; for(int i = 0; i<n; i++){ if(belongs(cand, i)){ maxSZ ++; } } return maxSZ; } int R = 0; int max_dist = 0; pair<int, int> find_axis(){ int rec = 0; int next = 1; int cur = 0; for(int i = 0; i<n; i++){ if(getDist(cur, i)>rec){ rec = getDist(cur, i); next= i; } } rec= 0; cur= next; for(int i = 0; i<n; i++){ if(getDist(cur, i)>rec){ rec = getDist(cur, i); next= i; } } return {cur, next}; } pair<int, int> axis; void find_center(){ axis= find_axis(); int i = axis.first, j = axis.second; int dist_total = getDist(i, j); auto v = get_pos(i, j); int pathR = 1e9; for(auto mid: v){ pathR = min(pathR, max(mid.first,dist_total-mid.first)); } R = pathR; max_dist = dist_total; axis = {i, j}; } int hubDistance(int N, int sub) { fill(&queried[0][0], &queried[MAX_N-1][MAX_N], false); n= N; find_center(); if(sub == 2){ return R; } int min_big_child = 1e9; if(sub == 4){ auto v = get_pos(axis.first, axis.second); int left= 0; int dist_total = getDist(axis.first, axis.second); for(auto e: v){ int mid = e.second; int right = n -left-mid; if(max(e.first, dist_total-e.first) == R){ if(left<=n/2 && right <= n/2 && mid<=n/2){ return R; } } left += e.second; } return -R; } int left= 0; for(auto e : get_pos(axis.first, axis.second)){ int mid = e.second; int right = n -left-mid; int dist_total = getDist(axis.first, axis.second); if(max(e.first, dist_total-e.first) == R && (left<=n/2 && right<= n/2)){ min_big_child= min(min_big_child, find_sz_big(axis, e.first)); } if(min_big_child <= (N/2)){ return R; } } if(min_big_child <= (N/2)){ return R; } else{ 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...