# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
302434 | square1001 | Towns (IOI15_towns) | C++14 | 21 ms | 896 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "towns.h"
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int hubDistance(int N, int sub) {
if(sub == 1 || sub == 2) {
vector<int> da(N);
for(int i = 1; i < N; ++i) {
da[i] = getDistance(0, i);
}
int ma = max_element(da.begin(), da.end()) - da.begin();
vector<int> db(N);
for(int i = 0; i < N; ++i) {
if(i != ma) {
db[i] = getDistance(ma, i);
}
}
int mb = max_element(db.begin(), db.end()) - db.begin();
int mindiff = (1 << 30);
for(int i = 0; i < N; ++i) {
if(i != ma && i != mb) {
int dy = getDistance(mb, i);
mindiff = min(mindiff, abs(db[i] - dy));
}
}
return (db[mb] + mindiff) / 2;
}
if(sub == 3) {
vector<vector<int> > dlist(N, vector<int>(N, -1));
for(int i = 0; i < N; ++i) {
for(int j = 0; j < i; ++j) {
int res = getDistance(i, j);
dlist[i][j] = res;
dlist[j][i] = res;
}
}
int ma = max_element(dlist[0].begin(), dlist[0].end()) - dlist[0].begin();
int mb = max_element(dlist[ma].begin(), dlist[ma].end()) - dlist[ma].begin();
vector<int> ds(N);
int mindiff = (1 << 30);
for(int i = 0; i < N; ++i) {
ds[i] = dlist[ma][i] - dlist[mb][i];
mindiff = min(mindiff, abs(ds[i]));
}
int R = (dlist[ma][mb] + mindiff) / 2;
vector<int> depth(N);
for(int i = 0; i < N; ++i) {
depth[i] = (dlist[ma][i] + dlist[mb][i] - dlist[ma][mb]) / 2;
}
// ds[i] = mindiff pattern
int cl1 = 0, cr1 = 0;
for(int i = 0; i < N; ++i) {
if(ds[i] < mindiff) ++cl1;
if(ds[i] > mindiff) ++cr1;
}
int cm1 = 0;
for(int i = 0; i < N; ++i) {
int cnt = 0;
for(int j = 0; j < N; ++j) {
if(ds[i] == mindiff && ds[j] == mindiff && dlist[i][j] < depth[i] + depth[j]) {
++cnt;
}
}
cm1 = max(cnt, cm1);
}
if(cm1 >= 1 && cl1 <= N / 2 && cm1 <= N / 2 && cr1 <= N / 2) {
return R;
}
// ds[i] = -mindiff pattern
int cl2 = 0, cr2 = 0;
for(int i = 0; i < N; ++i) {
if(ds[i] < -mindiff) ++cl2;
if(ds[i] > -mindiff) ++cr2;
}
int cm2 = 0;
for(int i = 0; i < N; ++i) {
int cnt = 0;
for(int j = 0; j < N; ++j) {
if(ds[i] == -mindiff && ds[j] == -mindiff && dlist[i][j] < depth[i] + depth[j]) {
++cnt;
}
}
cm2 = max(cnt, cm2);
}
if(cm2 >= 1 && cl2 <= N / 2 && cm2 <= N / 2 && cr2 <= N / 2) {
return R;
}
return -R;
}
if(sub == 4) {
vector<int> da(N);
for(int i = 1; i < N; ++i) {
da[i] = getDistance(0, i);
}
int ma = max_element(da.begin(), da.end()) - da.begin();
vector<int> db(N);
for(int i = 0; i < N; ++i) {
if(i != ma) {
db[i] = getDistance(ma, i);
}
}
int mb = max_element(db.begin(), db.end()) - db.begin();
vector<int> ds(N);
int mindiff = (1 << 30);
for(int i = 0; i < N; ++i) {
int dy = getDistance(mb, i);
ds[i] = db[i] - dy;
mindiff = min(mindiff, abs(ds[i]));
}
int R = (db[mb] + mindiff) / 2;
int cl1 = 0, cm1 = 0, cr1 = 0;
for(int i = 0; i < N; ++i) {
if(ds[i] < mindiff) ++cl1;
else if(ds[i] == mindiff) ++cm1;
else ++cr1;
}
if(cm1 >= 1 && cl1 <= N / 2 && cm1 <= N / 2 && cr1 <= N / 2) {
return R;
}
int cl2 = 0, cm2 = 0, cr2 = 0;
for(int i = 0; i < N; ++i) {
if(ds[i] < -mindiff) ++cl2;
else if(ds[i] == -mindiff) ++cm2;
else ++cr2;
}
if(cm2 >= 1 && cl2 <= N / 2 && cm2 <= N / 2 && cr2 <= N / 2) {
return R;
}
return -R;
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |