Submission #568135

#TimeUsernameProblemLanguageResultExecution timeMemory
568135benjaminkleynIdeal city (IOI12_city)C++17
32 / 100
877 ms19856 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; map<pair<int,int>, bool> exists; map<pair<int,int>, int> node_of; int sz[100000]; int sub_sz[100000]; bool vis[100000]; int dfs(pair<int,int> u) { int cur_node = node_of[u]; vis[cur_node] = true; int cur_x = u.first; sub_sz[cur_node] = sz[cur_node]; while (exists[{++cur_x, u.second}] == true) { if (exists[{cur_x, u.second - 1}] == true && !vis[node_of[{cur_x, u.second - 1}]]) sub_sz[cur_node] += dfs({cur_x, u.second - 1}); if (exists[{cur_x, u.second + 1}] == true && !vis[node_of[{cur_x, u.second + 1}]]) sub_sz[cur_node] += dfs({cur_x, u.second + 1}); } cur_x = u.first + 1; while (exists[{--cur_x, u.second}] == true) { if (exists[{cur_x, u.second - 1}] == true && !vis[node_of[{cur_x, u.second - 1}]]) sub_sz[cur_node] += dfs({cur_x, u.second - 1}); if (exists[{cur_x, u.second + 1}] == true && !vis[node_of[{cur_x, u.second + 1}]]) sub_sz[cur_node] += dfs({cur_x, u.second + 1}); } return sub_sz[cur_node]; } int solve(int N, int *X, int *Y) { exists.clear(); node_of.clear(); for (int i = 0; i < N; i++) exists[{X[i], Y[i]}] = true; int node = 0; for (int i = 0; i < N; i++) { if (node_of[{X[i], Y[i]}] != 0) continue; node_of[{X[i], Y[i]}] = ++node; int cur_x = X[i]; while (exists[{--cur_x, Y[i]}] == true) node_of[{cur_x, Y[i]}] = node; cur_x = X[i]; while (exists[{++cur_x, Y[i]}] == true) node_of[{cur_x, Y[i]}] = node; } for (int i = 1; i <= node; i++) sz[i] = sub_sz[i] = vis[i] = 0; for (int i = 0; i < N; i++) sz[node_of[{X[i], Y[i]}]]++; dfs({X[0], Y[0]}); ll res = 0; for (int i = 2; i <= node; i++) res += sub_sz[i] * (N - sub_sz[i]) % 1'000'000'000, res %= 1'000'000'000; return (int) res; } int DistanceSum(int N, int *X, int *Y) { return (solve(N, X, Y) + solve(N, Y, X)) % 1'000'000'000; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...