제출 #1249344

#제출 시각아이디문제언어결과실행 시간메모리
1249344domiIdeal city (IOI12_city)C++20
100 / 100
101 ms16144 KiB
#include <bits/stdc++.h> const int MOD = 1e9; using namespace std; int n; int solve(map<int, vector<int>>& mp) { vector<vector<int>> T; map<pair<int, int>, int> id; vector<int> s; int cnt = -1; int idx = 0; for (auto &[v, ap] : mp) { sort(ap.begin(), ap.end()); ++idx; for (int i = 0; i < (int)ap.size(); ++i) { if (i == 0 || ap[i] != ap[i - 1] + 1) { ++cnt; T.push_back({}); s.push_back(0); } id[{v, ap[i]}] = cnt; ++s.back(); auto it_prev = id.find({v - 1, ap[i]}); if (idx != 1 && it_prev != id.end()) { int neigh = it_prev->second; if (cnt < (int)T.size() && neigh < (int)T.size()) { if (T[cnt].empty() || neigh != T[cnt].back()) { T[cnt].push_back(neigh); T[neigh].push_back(cnt); } } } } } vector<int> SZ(cnt + 1, 0); long long ans = 0; function<void(int, int)> dfs = [&](int nod, int p) { SZ[nod] = s[nod]; for (int son : T[nod]) { if (son == p) continue; dfs(son, nod); SZ[nod] += SZ[son]; ans += 1LL * (n - SZ[son]) * SZ[son]; } }; dfs(0, -1); return (int)(ans % MOD); } int DistanceSum(int N, int *X, int *Y) { n = N; map<int, vector<int>> lin, col; for (int i = 0; i < n; ++i) { col[X[i]].push_back(Y[i]); lin[Y[i]].push_back(X[i]); } return (solve(lin) + solve(col)) % MOD; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...