Submission #923787

#TimeUsernameProblemLanguageResultExecution timeMemory
923787aykhnThe Xana coup (BOI21_xanadu)C++17
100 / 100
63 ms25428 KiB
#include <bits/stdc++.h>
// author: aykhn
using namespace std;
#define int long long
#define inf 0x3F3F3F3F

const int MXN = 1e5 + 5;

int n;
vector<int> adj[MXN];
int val[MXN], dp[MXN][2][2];

// dp[i][j][k] = j by doing k ops and ok subtree

void dfs(int a, int p)
{
    vector<int> v1;
    int f = 0;
    for (int v : adj[a])
    {
        if (v == p) continue;
        f = 1;
        dfs(v, a);
        v1.push_back(v);
    }
    if (!f)
    {
        if (!val[a]) dp[a][0][0] = 0, dp[a][0][1] = inf, dp[a][1][0] = inf, dp[a][1][1] = 1;
        else dp[a][0][0] = inf, dp[a][0][1] = 1, dp[a][1][0] = 0, dp[a][1][1] = inf;
        return;
    }
    if (!val[a])
    {
        dp[a][0][0] = 0;
        vector<int> nw;
        for (int v : v1)
        {
            dp[a][0][0] += dp[v][0][0];
            nw.push_back(dp[v][0][1] - dp[v][0][0]);
        }
        sort(nw.begin(), nw.end());
        int s = 0, mn = 0;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 1) mn = min(mn, s);
        }
        dp[a][0][0] += mn;
        //---
        dp[a][0][1] = 1;
        nw.clear();
        for (int v : v1)
        {
            dp[a][0][1] += dp[v][1][0];
            nw.push_back(dp[v][1][1] - dp[v][1][0]);
        }
        sort(nw.begin(), nw.end());
        s = 0, mn = inf;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 0) mn = min(mn, s);
        }
        dp[a][0][1] += mn;
        //---
        dp[a][1][0] = 0;
        nw.clear();
        for (int v : v1)
        {
            dp[a][1][0] += dp[v][0][0];
            nw.push_back(dp[v][0][1] - dp[v][0][0]);
        }
        sort(nw.begin(), nw.end());
        s = 0, mn = inf;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 0) mn = min(mn, s);
        }
        dp[a][1][0] += mn;
        //---
        dp[a][1][1] = 1;
        nw.clear();
        for (int v : v1)
        {
            dp[a][1][1] += dp[v][1][0];
            nw.push_back(dp[v][1][1] - dp[v][1][0]);
        }
        sort(nw.begin(), nw.end());
        s = 0, mn = 0;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 1) mn = min(mn, s);
        }
        dp[a][1][1] += mn;
    }
    else
    {
        dp[a][0][0] = 0;
        vector<int> nw;
        for (int v : v1)
        {
            dp[a][0][0] += dp[v][0][0];
            nw.push_back(dp[v][0][1] - dp[v][0][0]);
        }
        sort(nw.begin(), nw.end());
        int s = 0, mn = inf;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 0) mn = min(mn, s);
        }
        dp[a][0][0] += mn;
        //---
        dp[a][0][1] = 1;
        nw.clear();
        for (int v : v1)
        {
            dp[a][0][1] += dp[v][1][0];
            nw.push_back(dp[v][1][1] - dp[v][1][0]);
        }
        sort(nw.begin(), nw.end());
        s = 0, mn = 0;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 1) mn = min(mn, s);
        }
        dp[a][0][1] += mn;
        //---
        dp[a][1][0] = 0;
        nw.clear();
        for (int v : v1)
        {
            dp[a][1][0] += dp[v][0][0];
            nw.push_back(dp[v][0][1] - dp[v][0][0]);
        }
        sort(nw.begin(), nw.end());
        s = 0, mn = 0;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 1) mn = min(mn, s);
        }
        dp[a][1][0] += mn;
        //---
        dp[a][1][1] = 1;
        nw.clear();
        for (int v : v1)
        {
            dp[a][1][1] += dp[v][1][0];
            nw.push_back(dp[v][1][1] - dp[v][1][0]);
        }
        sort(nw.begin(), nw.end());
        s = 0, mn = inf;
        for (int i = 0; i < nw.size(); i++)
        {
            s += nw[i];
            if (i % 2 == 0) mn = min(mn, s);
        }
        dp[a][1][1] += mn;
    }

}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    cin >> n;
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for (int i = 1; i <= n; i++) cin >> val[i];
    dfs(1, 1);
    if (dp[1][0][1] >= inf && dp[1][0][0] >= inf)
    {
        cout << "impossible\n";
        return 0;
    }
    cout << min(dp[1][0][1], dp[1][0][0]) << '\n';
}
//

Compilation message (stderr)

xanadu.cpp: In function 'void dfs(long long int, long long int)':
xanadu.cpp:43:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
xanadu.cpp:59:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
xanadu.cpp:75:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
xanadu.cpp:91:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
xanadu.cpp:109:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
xanadu.cpp:125:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
xanadu.cpp:141:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
xanadu.cpp:157:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 |         for (int i = 0; i < nw.size(); i++)
      |                         ~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...