Submission #318028

#TimeUsernameProblemLanguageResultExecution timeMemory
318028tengiz05Ideal city (IOI12_city)C++17
100 / 100
77 ms11484 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define all(v) (v).begin(),(v).end() using namespace std; typedef long long ll; const ll N = 1e5+5, mod = 1e9; ll sz[N], c[N], n, id[N]; bool used[N]; vector<int> edges[N]; vector<pair<int, int>> p; ll ans; void dfs(int u){ sz[u] = c[u]; used[u]=true; for(auto v : edges[u]){ if(!used[v]){ dfs(v); sz[u] += sz[v]; } }ans += sz[u]*(n-sz[u]);ans%=mod; } void build(){ sort(all(p)); int timer=0; for(int i=0;i<n;i++){ int e=i; while(e+1<n && p[e].ff == p[e+1].ff && p[e+1].ss == p[e].ss+1)e++; for(int j=i;j<=e;j++){ int x = lower_bound(all(p), make_pair(p[j].ff-1, p[j].ss))-p.begin(); if(p[x] == make_pair(p[j].ff-1, p[j].ss)){ edges[id[x]].push_back(timer); edges[timer].push_back(id[x]); }id[j] = timer; }c[timer] = e-i+1; timer++; i = e; }dfs(0); for(int i=0;i<n;i++)c[i]=0, sz[i]=0, id[i]=0; for(int i=0;i<=timer;i++)edges[i].clear(), used[i]=0; } int DistanceSum(int NN, int *X, int *Y) { n = NN; for(int i=0;i<n;i++){ p.push_back({X[i], Y[i]}); }build(); p.clear(); for(int i=0;i<n;i++){ p.push_back({Y[i], X[i]}); }build(); return (int)ans%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...