Submission #562601

#TimeUsernameProblemLanguageResultExecution timeMemory
562601Leo121Ideal city (IOI12_city)C++14
100 / 100
430 ms25736 KiB
#include <bits/stdc++.h> #define forn(i, a, b) for(int i = int (a); i <= int(b); ++ i) #define fora(i, a, b) for(int i = int (a); i >= int(b); -- i) #define pb push_back #define fi first #define se second #define mp make_pair using namespace std; typedef pair<int, int> pii; typedef long long ll; typedef vector<int> vi; const int maxn = 1e5; const int mx[4] = {0, 0, 1, -1}; const int my[4] = {1, -1, 0, 0}; map<pii, int> mapa; set<int> aux[maxn]; vi treex[maxn]; vi treey[maxn]; int szx[maxn]; int szy[maxn]; int compx[maxn]; int compy[maxn]; int arre[maxn][4]; bool visitadox[maxn]; bool visitadoy[maxn]; ll res; int n; ll mod = 1e9; void dfsx(int u, int p){ for(auto v : treex[u]){ if(v != p){ dfsx(v, u); res += ((ll) n - (ll) szx[v]) * (ll) szx[v]; res %= mod; szx[u] += szx[v]; } } } void dfsy(int u, int p){ for(auto v : treey[u]){ if(v != p){ dfsy(v, u); res += ((ll) n - (ll) szy[v]) * (ll) szy[v]; res %= mod; szy[u] += szy[v]; } } } void moverme(int i, int compo, int ini){ while(ini != -1){ if(i <= 1){ compy[ini] = compo; visitadoy[ini] = 1; } else{ compx[ini] = compo; visitadox[ini] = 1; } ini = arre[ini][i]; } } int DistanceSum(int N, int *X, int *Y) { n = N; forn(i, 0, N - 1){ mapa[mp(X[i], Y[i])] = i; } memset(arre, -1, sizeof(arre)); forn(i, 0, N - 1){ forn(j, 0, 3){ if(mapa.count(mp(X[i] + mx[j], Y[i] + my[j]))){ arre[i][j] = mapa[mp(X[i] + mx[j], Y[i] + my[j])]; } } } ///x int compox = -1, compoy = -1; forn(i, 0, N - 1){ if(!visitadoy[i]){ moverme(0, ++ compoy, i); moverme(1, compoy, i); } if(!visitadox[i]){ moverme(2, ++ compox, i); moverme(3, compox, i); } } ///visitado y forn(i, 0, N - 1){ forn(j, 2, 3){ if(mapa.count(mp(X[i] + mx[j], Y[i] + my[j]))){ aux[compy[i]].insert(compy[mapa[mp(X[i] + mx[j], Y[i] + my[j])]]); } } } forn(i, 0, compoy){ for(auto j : aux[i]){ treey[i].pb(j); } aux[i].clear(); } forn(i, 0, N - 1){ forn(j, 0, 1){ if(mapa.count(mp(X[i] + mx[j], Y[i] + my[j]))){ aux[compx[i]].insert(compx[mapa[mp(X[i] + mx[j], Y[i] + my[j])]]); } } szx[compx[i]] ++; szy[compy[i]] ++; } forn(i, 0, compox){ for(auto j : aux[i]){ treex[i].pb(j); } aux[i].clear(); } dfsx(0, 0); dfsy(0, 0); return (int) res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...