# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
1037337 |
2024-07-28T14:15:08 Z |
anton |
Towns (IOI15_towns) |
C++17 |
|
84 ms |
976 KB |
#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;
set<int> get_pos(int a, int b){
set<int> cats;
for(int i = 0; i<n; i++){
cats.insert(((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<pair<Base, int>> groups;
groups.push_back({Base(axis, root_pos), 1});
groups.push_back({Base({axis.second, axis.first}, getDist(axis.first, axis.second)-root_pos), 1});
for(int i = 0; i<n; i++){
for(pair<Base, int>& g: groups){
if(belongs(g.first, i)){
g.second++;
break;
}
}
groups.push_back({Base({axis.first, i}, root_pos), 1});
}
int maxSZ = 0;
for(auto e: groups){
maxSZ = max(maxSZ, e.second);
}
return maxSZ;
}
int hubDistance(int N, int sub) {
fill(&queried[0][0], &queried[MAX_N-1][MAX_N], false);
n= N;
int R = 0;
pair<int, int> axis;
for(int i = 0; i<N; i++){
for(int j = i+1; j<N; j++){
if(getDist(i, j)>R){
int dist_total = getDist(i, j);
auto v = get_pos(i, j);
int pathR = 1e9;
for(auto mid: v){
pathR = min(pathR, max(mid,dist_total-mid));
}
if(pathR > R){
R = pathR;
axis = {i, j};
}
}
}
}
int min_big_child = 1e9;
for(auto e : get_pos(axis.first, axis.second)){
int dist_total = getDist(axis.first, axis.second);
if(max(e, dist_total-e) == R){
min_big_child= min(min_big_child, find_sz_big(axis, e));
}
}
if(min_big_child <= (N/2)){
return R;
}
else{
return -R;
}
}
Compilation message
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:90:28: warning: unused parameter 'sub' [-Wunused-parameter]
90 | int hubDistance(int N, int sub) {
| ~~~~^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
84 ms |
856 KB |
Output is correct |
2 |
Correct |
64 ms |
856 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
15 ms |
860 KB |
Output is correct |
5 |
Correct |
16 ms |
860 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
344 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
70 ms |
976 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
348 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |