Submission #1198456

#TimeUsernameProblemLanguageResultExecution timeMemory
1198456totoroIdeal city (IOI12_city)C++20
100 / 100
160 ms19384 KiB
#include <iostream> #include <map> #include <set> #include <utility> #include <vector> long long MOD = 1e9; int n; int ansFor(std::set<std::pair<int, int>> &coords) { std::map<std::pair<int, int>, int> colors; int cur = 0; std::vector<std::vector<int>> adj; std::vector<int> weight; for (auto [x, y] : coords) { // std::cout << x << ' ' << y << '\n'; // std::cout << "(" << cur << ")\n"; if (cur >= adj.size()) adj.emplace_back(), weight.emplace_back(); if (coords.count(std::make_pair(x - 1, y)) && !(coords.count(std::make_pair(x - 1, y - 1)) && coords.count(std::make_pair(x, y - 1)))) { adj[cur].push_back(colors[std::make_pair(x - 1, y)]); adj[colors[std::make_pair(x - 1, y)]].push_back(cur); } colors[std::make_pair(x, y)] = cur; ++weight[cur]; if (!coords.count(std::make_pair(x, y + 1))) ++cur; } // for (int i = 0; i < adj.size(); ++i) { // std::cout << i << ':'; // for (int j : adj[i]) { // std::cout << ' ' << j; // } // std::cout << '\n'; // } long long ans = 0; auto dfs = [&](int node, int p, auto dfs) -> long long { long long myweight = weight[node]; for (int to : adj[node]) { if (to == p) continue; myweight += dfs(to, node, dfs); } ans += (myweight) * (n - myweight); ans %= MOD; return myweight; }; dfs(0, -1, dfs); return ans; } int DistanceSum(int N, int *X, int *Y) { n = N; std::set<std::pair<int, int>> normalcoords; for (int i = 0; i < N; ++i) { normalcoords.emplace(X[i], Y[i]); } long long ans = 0; ans += ansFor(normalcoords); ans %= MOD; std::set<std::pair<int, int>> flippedcoords; for (int i = 0; i < N; ++i) { flippedcoords.emplace(Y[i], X[i]); } ans += ansFor(flippedcoords); ans %= MOD; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...