답안 #391455

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
391455 2021-04-18T19:14:28 Z MrRobot_28 Svjetlo (COCI20_svjetlo) C++17
20 / 110
37 ms 35316 KB
#include<bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define sz(a) (int)a.size()
#define ll long long
#define int long long
#define ld long double
const int N = 3e5 + 100;
int dp[N][2][2];
int n;
vector <int> g[N];
string s;
void dfs(int v, int p = -1)
{
    int sum = 0;
    bool fl = (s[v] == '0' ? 1 : 0);
    for(auto to : g[v])
    {
        if(to == p)
        {
            continue;
        }
        dfs(to, v);
        if(dp[to][0][0] != 1e9)
        {
            sum += dp[to][0][0] + (dp[to][0][0] == 0 ? 0 : 3);
        }
        else
        {
            sum += dp[to][0][1] + 1;
            fl = !fl;
        }
    }
    if(sum || s[v] == '0')
    {
        sum++;
    }
    dp[v][0][fl] = sum;
}
int dfs1(int v, int p = -1, int g1 = 0, int g2 = 0)
{
    int ret = 1e9;
    int sum = 0;
    bool fl = 0;
    if(dp[v][0][0] != 1e9) fl = 0;
    else fl = 1;
    sum = dp[v][0][fl];
    for(auto to : g[v])
    {
        if(to == p)
        {
            continue;
        }
        int new_sum = sum;
        bool new_fl = fl;
        if(dp[to][0][0] != 1e9)
        {
            new_sum -= dp[to][0][0] + (dp[to][0][0] == 0 ? 0 : 3);
        }
        else
        {
            new_sum -= dp[to][0][1] + 1;
            new_fl = !new_fl;
        }
        if(new_sum == 1 && !new_fl) new_sum = 0;
        int new_sum1 = new_sum;
        if(g1 && !new_sum1) new_sum1++;
        new_sum1 += g1;
        if(g2) new_sum1++;
        else if(g1) new_sum1 += 3;
        ret = min(ret, dfs1(to, v, new_sum1, g2 ^ new_fl));
        if(new_fl == 0)
        {
            if(new_sum == 0)
            {
                new_sum = 1;
            }
            dp[v][1][0] = min(dp[v][1][0], new_sum + dp[to][1][1]);
            dp[v][1][1] = min(dp[v][1][1], new_sum + dp[to][1][0] + 2);
         }
        else
        {
            dp[v][1][0] = min(dp[v][1][0], new_sum + dp[to][1][0] + 2);
            dp[v][1][1] = min(dp[v][1][1], new_sum + dp[to][1][1]);
        }
    }
    dp[v][1][fl] = min(dp[v][1][fl], max(1LL, dp[v][0][fl]));
   // cout << dp[v][1][1] << " " << dp[v][1][0] << " ";
    if(g1 == 0)
    {
        ret = min(ret, dp[v][1][1]);
    }
    else if(g2)
    {
        ret = min(ret, dp[v][1][0] + g1 + 1);
    }
    else
    {
        ret = min(ret, dp[v][1][1] + g1 + 3);
    }
    int fl1 = 0;
    if(dp[v][0][1] != 1e9)
    {
        fl1 = 1;
    }
    int sum1 = dp[v][0][fl];
    if(!sum1)
    {
        sum1 = 1;
    }
    sum1 += g1;
    if(g2)
    {
        sum1++;
        fl1 ^= 1;
    }
    else if(g1)
    {
        sum1 += 3;
    }
    int mini[2];
    mini[0] = mini[1] = 1e9;
    for(auto to : g[v])
    {
        if(to == p)
        {
            continue;
        }
        int fl2 = 0;
        if(dp[to][0][1] != 1e9)
        {
            fl2 = 1;
        }
        int s1 = dp[to][0][fl2];
        if(fl2)
        {
            s1++;
        }
        else if(s1)
        {
            s1 += 3;
        }
        int new_sum = sum1 - s1;
        int new_fl = fl2 ^ fl1;
        ret = min(ret, dp[to][1][0] + 2 + new_sum + mini[new_fl]);
        ret = min(ret, dp[to][1][1] + new_sum + mini[!new_fl]);
        if(!fl2)
        {
            mini[0] = min(mini[0], dp[to][1][1] - s1);
            mini[1] = min(mini[1], dp[to][1][0] + 2 - s1);
        }
        else
        {
            mini[0] = min(mini[0], dp[to][1][0] + 2 - s1);
            mini[1] = min(mini[1], dp[to][1][1] - s1);
        }
    }
 //   cout << ret << "\n";
    return ret;
}
signed main()
{
//    ios_base::sync_with_stdio(0);
  //  cin.tie(0);
    //cout.tie(0);
    cin >> n;
    cin >> s;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            for(int t = 0; t < 2; t++)
            {
                dp[i][j][t] = 1e9;
            }
        }
    }
    for(int i = 0; i < n - 1; i++)
    {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs(0);
    cout << dfs1(0);
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 7244 KB Output is correct
2 Correct 5 ms 7244 KB Output is correct
3 Correct 5 ms 7244 KB Output is correct
4 Correct 5 ms 7244 KB Output is correct
5 Correct 5 ms 7244 KB Output is correct
6 Correct 5 ms 7244 KB Output is correct
7 Correct 5 ms 7244 KB Output is correct
8 Correct 5 ms 7244 KB Output is correct
9 Correct 5 ms 7244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 35 ms 35040 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 37 ms 35316 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 7244 KB Output is correct
2 Correct 5 ms 7244 KB Output is correct
3 Correct 5 ms 7244 KB Output is correct
4 Correct 5 ms 7244 KB Output is correct
5 Correct 5 ms 7244 KB Output is correct
6 Correct 5 ms 7244 KB Output is correct
7 Correct 5 ms 7244 KB Output is correct
8 Correct 5 ms 7244 KB Output is correct
9 Correct 5 ms 7244 KB Output is correct
10 Runtime error 35 ms 35040 KB Execution killed with signal 11
11 Halted 0 ms 0 KB -