Submission #416353

#TimeUsernameProblemLanguageResultExecution timeMemory
416353Emin2004Ideal city (IOI12_city)C++14
32 / 100
51 ms5316 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define pii pair<int, int> #define F first #define S second const int N = 100005; vector<int> a[N]; int w[N], sub[N], used[N]; ll m; set <pii> s; void DFS(int node){ used[node] = 1; sub[node] = w[node]; for(int i : a[node]){ if(!used[i]){ DFS(i); sub[node] += sub[i]; } } } ll getans(int node){ ll res = sub[node] * (m - sub[node]); used[node] = 2; for(int i : a[node]){ if(used[i] != 2){ res += getans(i); } } return res; } int DistanceSum(int n, int *x, int *y) { for(int i = 0; i < n; i++){ s.insert({x[i], y[i]}); } map<pii, int> mp; int idx = (*s.begin()).F; int idy = (*s.begin()).S; int sz = 1, nn = 1; s.erase(s.begin()); mp[{idx, idy}] = nn; while(s.size() > 0){ int curx = (*s.begin()).F; int cury = (*s.begin()).S; s.erase(s.begin()); if(curx == idx){ if(cury == idy + sz) { sz++; mp[{curx, cury}] = nn; } else{ idy = cury; w[nn] = sz; sz = 1; nn++; mp[{curx, cury}] = nn; } } else{ w[nn] = sz; sz = 1; nn++; idy = cury; idx = curx; mp[{curx, cury}] = nn; } } w[nn] = sz; for(auto i : mp){ int curx = i.F.F; int cury = i.F.S; int u = mp[{curx, cury}]; if(mp[{curx - 1, cury}]){ int v = mp[{curx - 1, cury}]; if(mp[{curx - 1, cury}] == mp[{curx - 1, cury - 1}] && mp[{curx, cury}] == mp[{curx, cury - 1}]) continue; a[u].pb(v); a[v].pb(u); } } DFS(1); m = sub[1]; ll ans = getans(1); for(int i = 1; i <= nn; i++){ a[i].clear(); used[i] = 0; sub[i] = 0; w[i] = 0; } mp.clear(); for(int i = 0; i < n; i++){ s.insert({y[i], x[i]}); } idx = (*s.begin()).F; idy = (*s.begin()).S; sz = 1, nn = 1; s.erase(s.begin()); mp[{idx, idy}] = nn; while(s.size() > 0){ int curx = (*s.begin()).F; int cury = (*s.begin()).S; s.erase(s.begin()); if(curx == idx){ if(cury == idy + sz) { sz++; mp[{curx, cury}] = nn; } else{ idy = cury; w[nn] = sz; sz = 1; nn++; mp[{curx, cury}] = nn; } } else{ w[nn] = sz; sz = 1; nn++; idy = cury; idx = curx; mp[{curx, cury}] = nn; } } w[nn] = sz; for(auto i : mp){ int curx = i.F.F; int cury = i.F.S; int u = mp[{curx, cury}]; if(mp[{curx - 1, cury}]){ int v = mp[{curx - 1, cury}]; if(mp[{curx - 1, cury}] == mp[{curx - 1, cury - 1}] && mp[{curx, cury}] == mp[{curx, cury - 1}]) continue; a[u].pb(v); a[v].pb(u); } } DFS(1); m = sub[1]; return ans + getans(1); } /* 11 2 5 2 6 3 3 3 6 4 3 4 4 4 5 4 6 5 3 5 4 5 6 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...