이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |