Submission #1034385

#TimeUsernameProblemLanguageResultExecution timeMemory
1034385idasIdeal city (IOI12_city)C++11
100 / 100
114 ms35536 KiB
#include <bits/stdc++.h> #define FOR(i, begin, end) for(int i=(begin); i<(end); i++) #define pb push_back #define s second #define f first using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pii; const int MxN=1e5+10, mod=1e9; ll cn[MxN][2], dp[MxN][2]; // how many nodes in group map<pii, int> gr[2]; set<int> ad[MxN][2]; void build(int u, int k, int pst=-1) { // cout << k << " -> " << u << '\n'; // for(auto it : ad[u][k]){ // cout << it << " "; // } // cout << '\n'; dp[u][k]=cn[u][k]; for(auto it : ad[u][k]){ if(it==pst) continue; build(it, k, u); dp[u][k]+=dp[it][k]; } } ll ans=0; void dfs(int u, int k, ll up=0, int pst=-1) { ans+=up*dp[u][k]%mod; ans%=mod; for(auto it : ad[u][k]){ if(it==pst) continue; dfs(it, k, up+dp[u][k]-dp[it][k], u); } } int DistanceSum(int n, int x[], int y[]) { vector<pii> inf; FOR(i, 0, n) { inf.pb({x[i],y[i]}); } sort(inf.begin(), inf.end()); int now; FOR(k, 0, 2) { // cout << k << ":\n"; // FOR(i, 0, n) // { // cout << inf[i].f << " " << inf[i].s << '\n'; // } FOR(i, 0, n) { if(i==0 || inf[i-1].f!=inf[i].f || inf[i-1].s+1!=inf[i].s) now=i; int a=inf[i].f, b=inf[i].s; gr[k][{a,b}]=now; cn[now][k]++; if(gr[k].count({a-1,b})){ int nxt=gr[k][{a-1,b}]; ad[now][k].insert(nxt); ad[nxt][k].insert(now); } } build(0, k); dfs(0, k); FOR(i, 0, n) swap(inf[i].f, inf[i].s); sort(inf.begin(), inf.end()); } 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...