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 pair<long long,long long> ii;
void find_roads(int n, int Q, int A[], int B[], int W[]) {
//get_distance(-1,28798);
ii arr[n];
arr[0] = ii(0,0);
for(int i = 1;i < n;i++){
arr[i] = ii(get_distance(1,i+1),i);
}
sort(arr,arr+n);
map<int,long long> m;
for(int i = 0;i < n;i++){
m[arr[i].second] = arr[i].first;
}
vector<int> child[n];
int parent[n];
int psize[n];
fill(psize,psize+n,0);
psize[0] = 1;
parent[0] = -1;
for(int i = 1;i < n;i++){
int l = 0;
int x = arr[i].second;
set<int> s;
int p = 0;
while(true){
p++;
//if(p >= 2000) get_distance(-1,28798);
s.insert(l);
//printf("%d\n",l);
if(child[l].size() == 0){
long long xl = get_distance(x+1,l+1);
long long d = (m[x] + m[l] - xl) / 2;
int prel = l;
//printf("%d %d %d\n",l,x,d);
while(m[l] > d){
l = parent[l];
//if(l == -1) get_distance(-1,28798);
//printf("%d\n",l);
}
//printf("%d ",d);
if(l == prel){
//printf("%d %d\n",x,l);
A[i-1] = x+1;
B[i-1] = l+1;
W[i-1] = m[x] - m[l];
child[l].push_back(x);
parent[x] = l;
while(prel > 0){
psize[prel]++;
prel = parent[prel];
}
parent[0]++;
s.clear();
break;
}
}
int maxi = -1;
for(int j = 0;j < child[l].size();j++){
if(s.find(child[l][j]) != s.end()) continue;
if(maxi == -1 || psize[child[l][j]] > psize[maxi]){
maxi = child[l][j];
}
}
if(maxi == -1){
//printf("%d %d\n",x,l);
A[i-1] = x+1;
B[i-1] = l+1;
W[i-1] = m[x] - m[l];
child[l].push_back(x);
parent[x] = l;
int prel = l;
while(prel > 0){
psize[prel]++;
prel = parent[prel];
}
parent[0]++;
s.clear();
break;
}
else{
l = maxi;
}
}
}
//for(int i = 0;i < n-1;i++){
// printf("%d %d %d\n",A[i],B[i],W[i]);
//}
return;
}
Compilation message (stderr)
citymapping.cpp: In function 'void find_roads(int, int, int*, int*, int*)':
citymapping.cpp:63:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j = 0;j < child[l].size();j++){
~~^~~~~~~~~~~~~~~~~
# | 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... |