Submission #218054

#TimeUsernameProblemLanguageResultExecution timeMemory
218054AQTIdeal city (IOI12_city)C++14
0 / 100
214 ms6260 KiB
#include <bits/stdc++.h> using namespace std; int N, C; vector<int> graph[100005]; int sz[100005]; set<pair<int, int>> st; map<pair<int, int>, pair<int, int>> par; vector<pair<int, int>> coords; map<pair<int, int>, int> who; pair<int, int> getrt(pair<int, int> n){ return par[n] = (par[n] == n ? n : getrt(par[n])); } void dfs(int n, int p){ for(int e : graph[n]){ if(e != p){ dfs(e, n); sz[n] += sz[e]; } } } void build(){ for(auto p : coords){ par[p] = p; if(st.count({p.first-1, p.second})){ par[getrt({p.first-1, p.second})] = p; } if(st.count({p.first+1, p.second})){ par[getrt({p.first+1, p.second})] = p; } st.insert({p.first, p.second}); } C = 0; for(int i = 0; i<N; i++){ if(par[coords[i]] == coords[i]){ who[coords[i]] = ++C; } } for(auto p : coords){ auto n = who[getrt(p)]; if(st.count({p.first, p.second-1})){ auto a = who[getrt({p.first, p.second-1})]; graph[a].push_back(n); } if(st.count({p.first, p.second+1})){ auto a = who[getrt({p.first, p.second+1})]; graph[a].push_back(n); } } for(int i = 1; i<=C; i++){ sort(graph[i].begin(), graph[i].end()); graph[i].erase(unique(graph[i].begin(), graph[i].end()), graph[i].end()); } } long long calc(int *X, int *Y){ for(int i = 0; i<N; i++){ coords.push_back({X[i], Y[i]}); } build(); dfs(1, 0); long long ans = 0; for(int i = 1; i<=C; i++){ ans += 1LL*sz[i]*(N-sz[i]); graph[i].clear(); } coords.clear(); par.clear(); st.clear(); who.clear(); return ans; } int DistanceSum(int NN, int *X, int *Y){ N = NN; long long ret = calc(X, Y); ret += calc(Y, X); return ret; } /* int main(){ cin.sync_with_stdio(0); cin.tie(0); cout.tie(0); } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...