#include<bits/stdc++.h>
using namespace std;
const int64_t MOD = 1e9;
int64_t n, ans;
void dfs(int nod, int p, vector<vector<int64_t>>& T, vector<int64_t>& SZ, vector<int64_t>& s) {
SZ[nod] = s[nod] - 1;
for (auto &son : T[nod]) {
if (son == p) continue;
dfs(son, nod, T, SZ, s);
SZ[nod] += SZ[son];
ans += (n - SZ[son]) * SZ[son];
}
}
int64_t solve(map<int64_t, vector<int64_t>>& mp) {
vector<vector<int64_t>>T;
map<pair<int64_t, int64_t>, int64_t>id;
vector<int64_t>s;
int64_t cnt = 0, idx = 0;
for (auto [x, v] : mp){
sort(v.begin(), v.end());
for (int i=0; i<v.size(); i++){
if (i == 0 || v[i] != v[i - 1] + 1){
cnt++;
s.push_back(0);
T.push_back({});
}
id[{x, v[i]}] = cnt;
s.back()++;
if (x != mp.begin()->first){
if (id.find({x-1, v[i]}) != id.end() && (T[cnt].empty() || id[{x-1, v[i]}] != T[cnt].back())){
T[cnt].push_back(id[{x - 1, v[i]}]);
T[id[{x - 1, v[i]}]].push_back(cnt);
}
}
}
}
vector<int64_t>SZ(cnt + 1, 0);
ans = 0;
// dfs(0, -1, T, SZ, s);
return ans;
}
int DistanceSum(int N, int *X, int *Y) {
n = N;
map<int64_t, vector<int64_t>>lin, col;
for (int64_t i = 0; i < N; ++i) {
col[X[i]].push_back(Y[i]);
lin[Y[i]].push_back(X[i]);
}
return solve(lin) + solve(col);
}
# | 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... |