Submission #516155

#TimeUsernameProblemLanguageResultExecution timeMemory
516155600MihneaIdeal city (IOI12_city)C++17
100 / 100
53 ms10252 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = (int) 1e5 + 7; const int M = (int) 1e9; int add(int a, int b) { a += b; if (a >= M) a -= M; if (a < 0) a -= M; return a; } int mul(int a, int b) { return a * (ll) b % M; } void addup(int &a, int b) { a = add(a, b); } void mulup(int a, int b) { a = a * (ll) b % M; } class Segment { private: public: int l, r, id; Segment(int l, int r, int id) : l(l), r(r), id(id) { } }; vector<int> g[N]; vector<Segment> segs[N]; void addEdge(int a, int b) { g[a].push_back(b); g[b].push_back(a); } int sum[N], T; void dfs1(int a, int p = -1) { for (auto &b : g[a]) { if (b == p) continue; dfs1(b, a); sum[a] += sum[b]; } } void dfs2(int &sol, int a, int p = -1) { for (auto &b : g[a]) { if (b == p) continue; dfs2(sol, b, a); addup(sol, mul(sum[b], T - sum[b])); } } int compute(int n, int *x, int *y) { T = n; int sol = 0; for (int i = 0; i < n; i++) g[i].clear(), segs[i].clear(); for (int i = 0; i < n; i++) g[x[i]].push_back(y[i]); int id = 0; for (int i = 0; i < n; i++) { sort(g[i].begin(), g[i].end()); int l = 0, r; while (l < (int) g[i].size()) { r = l; while (r + 1 < (int) g[i].size() && g[i][r + 1] == g[i][r] + 1) r++; sum[id] = r - l + 1; segs[i].push_back({g[i][l], g[i][r], id++}); l = r + 1; } } for (int i = 0; i < n; i++) g[i].clear(); for (int i = 1; i < n; i++) { int ant_p = 0; for (auto &seg : segs[i]) { while (true) { if (ant_p == (int) segs[i - 1].size()) break; if (segs[i - 1][ant_p].r < seg.l) ant_p++; else break; } int first_good = ant_p; while (true) { if (ant_p == (int) segs[i - 1].size()) break; if (segs[i - 1][ant_p].l > seg.r) break; addEdge(segs[i - 1][ant_p].id, seg.id); ant_p++; } ant_p = first_good; } } n = id; dfs1(0); dfs2(sol, 0); return sol; } int DistanceSum(int n, int *x, int *y) { { int __x = x[0], __y = y[0]; for (int i = 1; i < n; i++) { __x = min(__x, x[i]); __y = min(__y, y[i]); } for (int i = 0; i < n; i++) { x[i] -= __x; y[i] -= __y; } } return add(compute(n, x, y), compute(n, y, x)); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...