Submission #477026

#TimeUsernameProblemLanguageResultExecution timeMemory
477026mychecksedadPutovanje (COCI20_putovanje)C++17
25 / 110
119 ms37816 KiB
#include<bits/stdc++.h> using namespace std; typedef long long int ll; #define pb push_back #define all(x) x.begin(), x.end() const int N = 2e5 + 10, M = 1e5+10, F = 2147483646, K = 20; int n, a, b, depth[N], timein[N], lca[4*N][K]; vector<pair<int, pair<ll, ll>>> g[N]; vector<int> euler; pair<int, int> s[N]; ll ans = 0, m[N], sum = 0; void dfs(int v, int p, int d){ depth[v] = d; timein[v] = int(euler.size()); euler.pb(v); for(auto k: g[v]){ if(k.first != p){ dfs(k.first, v, d + 1); euler.pb(v); } } } int mx(int l, int r){ int k = __lg(r - l + 1); if(depth[lca[l][k]] < depth[lca[r - (1<<k) + 1][k]]) return lca[l][k]; return lca[r - (1<<k) + 1][k]; } void ans_dfs(int v, int p){ for(auto k: g[v]){ if(k.first != p){ ans_dfs(k.first, v); ans += min(sum * k.second.first, k.second.second); // cout << sum << ' ' << v << ' ' << k.first << ' ' << m[v] << '\n'; sum -= m[v]; m[v] = 0; } } ++m[s[v].first]; ++m[s[v].second]; if(s[v].first != 0) ++sum; if(s[v].second != 0) ++sum; } int main(){ cin.tie(0); ios::sync_with_stdio(0); cin >> n; for(int i = 0; i < n - 1; ++i){ ll w1, w2; cin >> a >> b >> w1 >> w2; g[a].pb({b, {w1, w2}}); g[b].pb({a, {w1, w2}}); } for(int i = 1; i <= n; i++) timein[i] = 1e9, s[i] = {0, 0}; dfs(1, 0, 0); for(int i = 0; i < int(euler.size()); i++) lca[i][0] = euler[i]; for(int j = 1; j < K; ++j){ for(int i = 0; i + (1 << (j-1)) <= int(euler.size()); ++i){ if(depth[lca[i][j - 1]] < depth[lca[i + (1<<(j-1))][j - 1]]) lca[i][j] = lca[i][j - 1]; else lca[i][j] = lca[i + (1<<(j-1))][j - 1]; } } for(int i = 1; i < n; i++){ int node = mx(min(timein[i], timein[i + 1]), max(timein[i + 1], timein[i])); if(node != i) s[i].second = node; if(node != i + 1) s[i + 1].first = node; } // for(int i = 1; i <= n; i++) cout << s[i].first << ' ' << s[i].second << '\n'; sum = 0; ans_dfs(1, 0); cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...