제출 #854468

#제출 시각아이디문제언어결과실행 시간메모리
854468vjudge1Sjekira (COCI20_sjekira)C++17
0 / 110
67 ms14920 KiB
//author: Ahmet Alp Orakci #include <bits/stdc++.h> using namespace std; using i64 = long long; #define int i64 #define ONLINE_JUDGE void solve(int n) { vector <int> vec(n +1); for(int i = 1; i <= n; i++) cin >> vec[i]; set <int> adj[n +1]; for(int i = 1; i <= n -1; i++) { int u, v; cin >> u >> v; adj[u].emplace(v); adj[v].emplace(u); } function <int(int, int)> dfsMax = [&](int node, int par) -> int { int ind = node; for(const int &child : adj[node]) { if(child != par) { int g = dfsMax(child, node); //cerr << child << " " << node << " :: " << g << "\n"; if(vec[g] >= vec[ind]) { ind = g; } } } return ind; }; int res = 0; function <void(int)> dfsAns = [&](int node) -> void { //cerr << "# " << node << "\n"; int cev = 0; vector <int> vvec; for(const int &child : adj[node]) { cev += vec[node]; int g = dfsMax(child, node); cerr << child << " " << node << " :: " << g << "\n"; cev += vec[g]; adj[child].erase(node); vvec.emplace_back(child); } adj[node].clear(); for(int &i : vvec) { dfsAns(dfsMax(i, node)); } //cerr << node << " " << cev << "\n"; res += cev; }; dfsAns(dfsMax(1, 0)); cout << res; return; } void solve2(int n) { vector <int> vec(n +5, -1); for(int i = 1; i <= n; i++) cin >> vec[i]; set <int> adj[n +1]; for(int i = 1; i <= n -1; i++) { int u, v; cin >> u >> v; adj[u].emplace(v); adj[v].emplace(u); } auto f = [&](int a, int b) -> int { if(vec[a] <= vec[b]) { return b; } return a; }; vector <int> ST(n * 4 + 5); function <int(int, int, int)> build = [&](int node, int l, int r) -> int { if(l == r) { return ST[node] = r; } int mid = (l + r) / 2; return ST[node] = f(build(node * 2, l, mid), build(node * 2 +1, mid +1, r)); }; build(1, 1, n); function <int(int, int, int, int, int)> get = [&](int node, int l, int r, int ql, int qr) -> int { if(r < ql || qr < l) { return 0; } else if(ql <= l && r <= qr) { return ST[node]; } int mid = (l + r) / 2; return f(get(node * 2, l, mid, ql, qr), get(node * 2 +1, mid +1, r, ql, qr)); }; int ans = 0; function <void(int, int)> dfs = [&](int l, int r) -> void { //cerr << l << " " << r << "\n"; if(r <= l) { return; } int g = get(1, 1, n, l, r); //cerr << l << " " << r << " " << g << "\n"; ans += vec[get(1, 1, n, l, g -1)]; ans += vec[get(1, 1, n, g +1, r)]; ans += vec[g] * 2; dfs(l, g -1); dfs(g +1, r); }; dfs(1, n); cout << ans; } signed main() { #ifndef ONLINE_JUDGE freopen(".in", "r", stdin); freopen(".out", "w", stdout); #endif ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t = 1; //cin >> t; for(int i = 1; i <= t; i++) { int n; cin >> n; //if(n <= 1000) // solve(n); //else solve2(n); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...