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<bits/stdc++.h>
#include "citymapping.h"
using namespace std;
const int mxN = 1000;
long long dst[mxN][mxN];
long long get_dst(int x, int y) {
if (x > y) {
swap(x, y);
}
auto &ret = dst[x][y];
if (~ret) {
return ret;
}
return ret = get_distance(x + 1, y + 1);
}
long long &dist(int x, int y) {
if (x > y) {
swap(x, y);
}
return dst[x][y];
}
int sz[mxN], Cnt;
vector<pair<int, int>> chd[mxN];
bool used[mxN];
void dfs0(int u, int r) {
sz[u] = 1;
Cnt++;
for (auto &to: chd[u]) {
if (!used[to.first]) {
dist(r, to.first) = dist(r, u) + to.second;
dfs0(to.first, r);
sz[u] += sz[to.first];
}
}
}
vector<pair<int, int>> lst;
int dfs1(int u) {
pair<int, int> mx = {-1, -1};
for (auto &to: chd[u]) {
if (!used[to.first] && (mx.first == -1 || sz[mx.first] < sz[to.first])) {
mx = to;
}
}
if (~mx.first) {
lst.push_back(mx);
return dfs1(mx.first);
}
return u;
}
void find_roads(int n, int q, int a[], int b[], int w[]) {
/*a[0] = 2; a[1] = 4; a[2] = 4; a[3] = 5;
b[0] = 4; b[1] = 1; b[2] = 2; b[3] = 3;
w[0] = 7; w[1] = 8; w[2] = 1; w[3] = 3;
return ;*/
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dst[i][j] = -1;
}
}
for (int i = 0; i < n; i++) {
dist(i, i) = 0;
}
vector<pair<long long, int>> ds;
for (int i = 1; i < n; i++) {
ds.push_back({get_dst(0, i), i});
//cerr << ds.back().first << " " << ds.back().second << "\n";
}
sort(ds.begin(), ds.end());
int m = 0;
for (auto &x: ds) {
int r = 0;
/*for (int i = 0; i < n; i++) {
cerr << dist(r, i) << "\n";
}*/
while (true) {
Cnt = 0;
dfs0(r, r);
if (Cnt == 1) {
break;
}
int l = dfs1(r);
long long xl = get_dst(x.second, l), rm = (get_dst(r, x.second) + get_dst(r, l) - xl) / 2;
for (auto &y: lst) {
used[y.first] = 1;
}
int i = 0;
// cerr << r << " " << get_dst(r, x.second) << " " << get_dst(r, l) << " " << xl << " " << rm;
while (rm > 0) {
rm -= lst[i++].second;
}
int M = (i ? lst[i - 1].first: r);
// cerr << " " << l << " " << x.second << " " << M << "\n";
dist(M, x.second) = (get_dst(r, x.second) + get_dst(l, x.second) - get_dst(r, l)) / 2;
lst.clear();
r = M;
}
a[m] = 1 + r; b[m] = 1 + x.second; w[m] = dist(r, x.second);
// cerr << " " << a[m] << " " << b[m] << " " << w[m] << "\n";
chd[r].push_back({b[m] - 1, w[m]});
dist(r, b[m] - 1) = w[m];
m++;
for (int i = 0; i < n; i++) {
used[i] = 0;
}
}
}
# | 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... |