Submission #1257712

#TimeUsernameProblemLanguageResultExecution timeMemory
1257712shafi_rootConstruction of Highway (JOI18_construction)C++20
100 / 100
266 ms23740 KiB
/* _In The Name Of God_ */ #include <bits/stdc++.h> using namespace std; #define maxs(a, b) a = max(a, b) #define mins(a, b) a = min(a, b) #define pb push_back #define F first #define S second #define lc id << 1 #define rc lc|1 #define mid ((l + r)/2) // #define int long long typedef pair<int, int> pii; typedef long long ll; const ll MOD = 1e9 + 7; // 998244353; const ll INF = 1e9 + 1; const int MXN = 2e5 + 5; const int LOG = 23; ll Pow(ll a, ll b) { return !b ? 1 : (Pow(a*a %MOD, b/2) * (b&1 ? a : 1)) %MOD; } int n, h[MXN], hd[MXN], sz[MXN], val[MXN], par[MXN]; vector<pii> E, stk[MXN], V; vector<int> adj[MXN]; void pre_dfs(int v, int p) { sz[v] = 1; int i = -1; h[v] = h[p] + (v != p); for (int k = 0; k < adj[v].size(); k++) { int u = adj[v][k]; if (u != p) { pre_dfs(u, v); sz[v] += sz[u]; if (i==-1 || sz[adj[v][i]] < sz[u]) i = k; } } if (i != -1) swap(adj[v][0], adj[v][i]); } void hld_dfs(int v, int p) { par[v] = p; if (adj[v][0] != p) { hd[adj[v][0]] = hd[v]; hld_dfs(adj[v][0], v); } for (int k = 1; k < adj[v].size(); k++) { int u = adj[v][k]; if (u != p) { hd[u] = u; hld_dfs(u, v); } } } ll M_sort(int l, int r) { if (r - l < 2) return 0; ll inv = M_sort(l, mid) + M_sort(mid, r); vector<pii> vec; int p1 = l, p2 = mid; ll sum = 0; while (p1 < mid || p2 < r) { if (p1 == mid) { inv += sum * V[p2].S; vec.pb(V[p2++]); } else if (p2 == r) { vec.pb(V[p1++]); } else { if (V[p2].F <= V[p1].F) { inv += sum * V[p2].S; vec.pb(V[p2++]); } else { sum += V[p1].S; vec.pb(V[p1++]); } } } for (int i = 0; i < vec.size(); i++) V[l+i] = vec[i]; vec.clear(); return inv; } void _solve() { cin >> n; for (int i = 1; i <= n; i++) cin >> val[i]; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); E.pb({u, v}); } pre_dfs(1, 1); hd[1] = 1; hld_dfs(1, 1); stk[1].pb({h[1], val[1]}); for (int i = 0; i < n-1; i++) { vector<pii> vec; int v = E[i].S; while (v != 1) { vector<pii> cev; v = par[v]; int R = hd[v], bf = h[R]-1; while (stk[R].size() && stk[R].back().F <= h[v]) { cev.pb({stk[R].back().S, stk[R].back().F-bf}); bf = stk[R].back().F; stk[R].pop_back(); } if (stk[R].size() && bf < h[v]) { cev.pb({stk[R].back().S, h[v]-bf}); } stk[R].pb({h[v], val[E[i].S]}); v = R; for (int i = (int)cev.size()-1; i >= 0; i--) { vec.pb(cev[i]); } } stk[hd[E[i].S]] = {{h[E[i].S], val[E[i].S]}}; swap(V, vec); cout << M_sort(0, V.size()) << '\n'; } } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int _ = 1; // cin >> _; while (_--) _solve(); return 0.0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...