제출 #496237

#제출 시각아이디문제언어결과실행 시간메모리
496237RainbowbunnyPower Plant (JOI20_power)C++17
100 / 100
399 ms77152 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 4e5 + 5; int n, ans; int c[MAXN], dp[MAXN]; string s; vector <int> Adj[MAXN]; void DFS(int node, int p = -1) { dp[node] = c[node]; int sum = 0; for(auto x : Adj[node]) { if(x == p) { continue; } DFS(x, node); sum += dp[x]; } dp[node] = max(dp[node], sum - c[node]); } void DFS2(int node, int p = -1, int curdp = 0) { int sum = 0; vector <int> VV; for(auto x : Adj[node]) { if(x == p) { VV.push_back(curdp); sum += curdp; } else { VV.push_back(dp[x]); sum += dp[x]; } } ans = max(ans, c[node]); ans = max(ans, sum - c[node]); for(int i = 0; i < (int)Adj[node].size(); i++) { int x = Adj[node][i]; if(x == p) { continue; } DFS2(x, node, max(c[node], sum - c[node] - VV[i])); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 1; i < n; i++) { int u, v; cin >> u >> v; Adj[u].push_back(n + i); Adj[n + i].push_back(u); Adj[v].push_back(n + i); Adj[n + i].push_back(v); } cin >> s; for(int i = 1; i <= n; i++) { c[i] = s[i - 1] - '0'; } DFS(1); ans = dp[1]; DFS2(1); cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...