Submission #274676

#TimeUsernameProblemLanguageResultExecution timeMemory
274676SaboonIdeal city (IOI12_city)C++14
32 / 100
17 ms4352 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn = 1e5 + 10; const ll mod = 1e9; ll n, p[maxn], par[maxn], lef[maxn], rig[maxn]; vector<ll> t[maxn]; ll answer = 0; ll Sum = 0, Num = 0; ll SZ; ll fen1[maxn], fen2[maxn]; void vitex(){ Sum = Num = 0; for (ll i = 1; i <= SZ; i++) fen1[i] = fen2[i] = 0; } pair<ll,ll> get(ll idx){ ll ret = 0, ted = 0; for (; idx; idx -= idx & -idx){ ret = (ret + fen1[idx]) % mod; ted = (ted + fen2[idx]); } return {ret,ted}; } ll get(ll idx, ll Dis, ll Ted){ idx ++; ll ret = (1LL*Sum*Ted + 1LL*Dis*Num) % mod; pair<ll,ll> i1 = get(SZ), i2 = get(idx); i1.first = (i1.first - i2.first + mod) % mod, i1.second -= i2.second; ll A = (1LL*Ted*i1.first%mod - 1LL*i1.second*idx%mod*Ted%mod) % mod; if (A < 0) A += mod; ll B = (1LL*i2.second*idx%mod*Ted - 1LL*i2.first*Ted%mod) % mod; if (B < 0) B += mod; return (0LL + ret + A + B) % mod; } void add(ll idx, ll Dis, ll Ted){ idx ++; Sum = (Sum + Dis) % mod; Num += Ted; for (ll i = idx; i <= SZ; i += i & -i){ fen1[i] = (fen1[i] + 1LL*Ted*idx) % mod; fen2[i] += Ted; } } ll minDis(ll x, ll L, ll R){ if (x < L) return L; if (x > R) return R; return x; } vector<pair<ll,ll>> dfs(ll v, ll parent = -1){ ll Size = rig[v]-lef[v]+1; vector<vector<pair<ll,ll>>> All; ll L = lef[v], R = rig[v]; for (auto u : t[v]){ if (u == parent) continue; All.push_back(dfs(u,v)); } SZ = Size; for (ll i = 0; i < Size; i++){ answer = (answer + get(i, 0, 1)) % mod; add(i, 0, 1); } vector<pair<ll,ll>> Ret(Size); for (ll i = 0; i < Size; i++) Ret[i].second = 1; ll cnt = 0; for (auto u : t[v]){ if (u == parent) continue; vector<pair<ll,ll>> Tmp = All[cnt++]; ll l = lef[u], r = rig[u]; for (ll j = 0; j < r-l+1; j++){ ll me = j+lef[u], nex = minDis(me, L, R); ll Dis = (Tmp[j].first + (1LL*abs(me-nex)+1)*Tmp[j].second) % mod; answer = (answer + get(nex-L, Dis, Tmp[j].second)); } for (ll j = 0; j < r-l+1; j++){ ll me = j+lef[u], nex = minDis(me, L, R); ll Dis = (Tmp[j].first + (1LL*abs(me-nex)+1)*Tmp[j].second) % mod; add(nex-L, Dis, Tmp[j].second); Ret[nex-L].first = (Ret[nex-L].first + Dis) % mod; Ret[nex-L].second += Tmp[j].second; } } vitex(); return Ret; } ll x[maxn], y[maxn]; int DistanceSum(int N, int *X, int *Y){ n = N; for (ll i = 0; i < n; i++) x[i] = X[i], y[i] = Y[i]; for (ll i = 0; i < n; i++) p[i] = i; sort(p, p+n, [](ll a, ll b){ if (x[a] != x[b]) return x[a] < x[b]; return y[a] < y[b]; }); for (ll i = 0; i < n; i++) par[i] = i, lef[i] = rig[i] = Y[i]; for (ll i = 1; i < n; i++) if (X[p[i]] == X[p[i-1]] and Y[p[i]] == Y[p[i-1]]+1) par[p[i]] = par[p[i-1]], rig[par[p[i]]] = Y[p[i]]; sort(p, p+n, [](ll a, ll b){ if (y[a] != y[b]) return y[a] < y[b]; return x[a] < x[b]; }); for (ll i = 1; i < n; i++) if (Y[p[i]] == Y[p[i-1]] and X[p[i]] == X[p[i-1]]+1 and (par[p[i]] == p[i] or par[p[i-1]] == p[i-1])) t[par[p[i]]].push_back(par[p[i-1]]), t[par[p[i-1]]].push_back(par[p[i]]); bool found = 0; for (ll i = 0; i < n; i++) if (par[i] == i and !found) dfs(i), found = 1; return answer; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...