Submission #1096012

#TimeUsernameProblemLanguageResultExecution timeMemory
1096012underwaterkillerwhaleLogičari (COCI21_logicari)C++17
110 / 110
45 ms21996 KiB
#include <bits/stdc++.h>
#define ll              long long
#define pii             pair<int,int>
#define pll             pair<ll,ll>
#define rep(i,m,n)      for(int i=(m); i<=(n); i++)
#define reb(i,m,n)      for(int i=(m); i>=(n); i--)
#define iter(id, v)     for(auto id : v)
#define fs              first
#define se              second
#define MP              make_pair
#define pb              push_back
#define bit(msk, i)     ((msk >> i) & 1)
#define SZ(v)           (ll)v.size()
#define ALL(v)          v.begin(),v.end()

using namespace std;

mt19937_64 rd(chrono :: steady_clock :: now ().time_since_epoch().count());
ll Rand (ll l, ll r) { return uniform_int_distribution<ll> (l, r) (rd); }

const int N = 1e5 + 7;
const int Mod = 1e9 + 7; ///loonf mod sai
const int INF = 1e9;
const ll BASE = 137;
const int szBL = 320;

int n, m;
int a[N];
vector<int> ke[N];

int dp[N][2][2], f[N][2][2], Val[N][2][2];

vector<int> C;
int dd[N];

void Find_cycle () {
    C = {-1};
    int ok = 0;
    function<void(int, int)> dfs = [&] (int u, int p) {
        dd[u] = 1;
        C.pb(u);
        iter (&v, ke[u])
            if (v != p && !ok) {
                if (dd[v] == 1) {
                    auto R = find(C.begin() + 1, C.end(), v);
                    if (R != C.begin()) {
                        C.erase(C.begin() + 1, R);
                    }
                    ok = 1;
                    return;
                }
                dfs(v, u);
            }
        if (!ok) C.pop_back();
    };
    dfs(1, 0);
    m = SZ(C) - 1;
    rep (i, 1, n) dd[i] = 0;
    rep (i, 1, m) dd[C[i]] = 1;
}

void Assign (int u, vector<int> &child) {
    if (SZ(child) == 0) {
        f[u][1][0] = 1;
        f[u][0][0] = 0;
        return;
    }
    f[u][0][0] = 0;
    f[u][1][0] = 1;
    vector<int> vec00, vec10;
    iter (&v, child) {
        if (f[v][0][1] > n && SZ(vec00) < 2) vec00.pb(v);
        if (f[v][0][0] > n && SZ(vec10) < 2) vec10.pb(v);
        f[u][0][0] = min (INF, f[u][0][0] + f[v][0][1]);
        f[u][1][0] = min (INF, f[u][1][0] + f[v][0][0]);
    }
    auto calc = [&] (int t, int p, vector<int> &vec) {
        int nt, np, pt, pp;
        if (t == 0 && p == 1) pt = 0, pp = 1, nt = 1, np = 1;
        else pt = 0, pp = 0, nt = 1, np = 0;
        if (SZ(vec) == 1) {
            int alterV = vec[0];
            f[u][t][p] = t;
            iter (&v, child) {
                if (v != alterV) f[u][t][p] = min (INF, f[u][t][p] + f[v][pt][pp]);
                else f[u][t][p] = min (INF, f[u][t][p] + f[v][nt][np]);
            }
        }
        else if (SZ(vec) == 0) {
            int Min = INF;
            f[u][t][p] = t;
            iter (&v, child) {
                f[u][t][p] = min (INF, f[u][t][p] + f[v][pt][pp]);
                Min = min(Min, -f[v][pt][pp] + f[v][nt][np]);
            }
            f[u][t][p] = min(INF, f[u][t][p] + Min);
        }
        else f[u][t][p] = INF;
    };
    calc(0, 1, vec00);
    calc(1, 1, vec10);
}

void dfs (int u, int p) {
    vector<int> child;
    iter (&v, ke[u]) {
        if (!dd[v] && v != p) {
            dfs(v, u);
            child.pb(v);
        }
    }
    Assign(u, child);
}

int calc (int t, int p) {///con 1 trang thai nao va look con nao ben phai chua
    rep (i, 1, m)
    rep (j, 0, 1)
    rep (t, 0, 1) dp[i][j][t] = INF;
    if (t == 1 && p == 1) {
        dp[2][0][1] = min(INF, Val[1][1][1] + Val[2][0][0]);
        dp[2][1][1] = min(INF, Val[1][1][0] + Val[2][1][0]);
    }
    else if (t == 1 && p == 0) {
        dp[2][0][1] = min(INF, Val[1][1][0] + Val[2][0][0]);
    }
    else if (t == 0 && p == 1) {
        rep (i, 0, 1) {
            dp[2][0][i] = min(INF, Val[1][0][1] + Val[2][0][i]);
            dp[2][1][i] = min(INF, Val[1][0][0] + Val[2][1][i]);
        }
    }
    else {
        rep (i, 0, 1) dp[2][0][i] = min(INF, Val[1][0][0] + Val[2][0][i]);
    }

    rep (i, 3, m) {
        dp[i][0][0] = min({INF,
                          dp[i - 1][0][1] + Val[i][0][0]});
        dp[i][0][1] = min({INF,
                          dp[i - 1][0][1] + Val[i][0][1],
                          dp[i - 1][1][1] + Val[i][0][0]});
        dp[i][1][0] = min({INF,
                          dp[i - 1][0][0] + Val[i][1][0]});
        dp[i][1][1] = min({INF,
                          dp[i - 1][1][0] + Val[i][1][0],
                          dp[i - 1][0][0] + Val[i][1][1]});
    }
    if (t == 1 && p == 1)
        return dp[m][0][0];
    else if (t == 1 && p == 0)
        return dp[m][1][0];
    else if (t == 0 && p == 1)
        return dp[m][0][1];
    else
        return dp[m][1][1];
}

void solution() {
    cin >> n;
    rep (i, 1, n) {
        int u, v;
        cin >> u >> v;
        ke[u].pb(v);
        ke[v].pb(u);
    }
    Find_cycle();
    rep (i, 1, n)
    rep (j, 0, 1)
    rep (t, 0, 1)
        f[i][j][t] = INF;
    rep (i, 1, m) {
        int u = C[i];
        dfs(u, 0);
    }
    rep (i, 1, m)
    rep (j, 0, 1)
    rep (t, 0, 1) {
        Val[i][j][t] = f[C[i]][j][t];
    }
    int res = INF;
    rep (i, 0, 1)
    rep (j, 0, 1) {
        res = min(res, calc(i, j));
    }
    if (res > n)
        cout << -1 <<"\n";
    else
        cout << res <<"\n";
}

#define file(name) freopen(name".inp","r",stdin); \
freopen(name".out","w",stdout);
int main () {
//    file("c");
    ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int num_Test = 1;
//    cin >> num_Test;
    while (num_Test--)
        solution();
}
/*
no bug +9

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...