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 "citymapping.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e3+5;
ll dist[MAXN][MAXN];
vector<tuple<int, int, int> > ans;
vector<int> subtree[MAXN];
mt19937 rng(time(0));
int n;
ll query(int a, int b) {
if(a == b) return 0;
if(a > b) swap(a, b);
if(dist[a][b]) return dist[a][b];
// printf("query %d %d\n", a, b);
return dist[a][b] = get_distance(a, b);
}
void solve(int cur) {
if(subtree[cur].size() == 1) return;
int x = rng()%int(subtree[cur].size());
x = subtree[cur][x];
int y = x;
for(auto vertex : subtree[cur]) if(query(x, vertex) > query(x, y)) y = vertex;
// printf("solve %d >> %d %d\n", cur, x, y); for(auto vertex : subtree[cur]) printf("%d ", vertex); cout << endl;
vector<pair<ll, int> > line;
vector<pair<ll, int> > aux;
for(int vertex : subtree[cur]) {
ll val = query(x, vertex) + query(y, vertex) - query(x, y); val /= 2;
if(val == 0) line.push_back({query(x, vertex), vertex});
val = query(x, y) - query(vertex, y) + val;
aux.push_back({val, vertex});
}
sort(line.begin(), line.end());
sort(aux.begin(), aux.end());
subtree[cur].clear();
int p = 0;
for(int i = 0; i < line.size(); i++) {
int vertex = line[i].second;
ll val = line[i].first;
if(i != 0) ans.push_back({vertex, line[i-1].second, line[i].first-line[i-1].first});
while(p < aux.size() && aux[p].first == val) subtree[vertex].push_back(aux[p++].second);
}
for(auto item : line) solve(item.second);
}
void find_roads(int N, int Q, int A[], int B[], int W[]) {
n = N;
for(int i = 1; i <= n; i++) subtree[n+1].push_back(i);
solve(n+1);
for(int i = 0; i < ans.size(); i++) tie(A[i], B[i], W[i]) = ans[i];
}
Compilation message (stderr)
citymapping.cpp: In function 'void solve(int)':
citymapping.cpp:42:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < line.size(); i++) {
~~^~~~~~~~~~~~~
citymapping.cpp:46:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(p < aux.size() && aux[p].first == val) subtree[vertex].push_back(aux[p++].second);
~~^~~~~~~~~~~~
citymapping.cpp: In function 'void find_roads(int, int, int*, int*, int*)':
citymapping.cpp:58:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < ans.size(); i++) tie(A[i], B[i], W[i]) = ans[i];
~~^~~~~~~~~~~~
# | 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... |