답안 #651982

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
651982 2022-10-21T02:29:14 Z thiago4532 Logičari (COCI21_logicari) C++17
110 / 110
400 ms 51476 KB
#include <bits/stdc++.h>
#define int ll
#define ff first
#define ss second
#define mp make_pair
#define fast_io do { ios::sync_with_stdio(false), cin.tie(0); } while(0)
#ifdef TDEBUG
#define debug(...) dout(#__VA_ARGS__, __VA_ARGS__)
#define cdeb cout
#define dfast_io do {} while(0)
#else
#define debug(...) do {} while(0)
struct dostream {} cdeb;
#define dfast_io fast_io
template<typename T>
dostream& operator<<(dostream& out, T&& t) { return out; }
#endif

template<typename T>
void dout(std::string const& name, T arg) { std::cerr << name << " = " << arg << std::endl; }
template<typename T1, typename... T2>
void dout(std::string const& names, T1 arg, T2... args) {
    std::cerr << names.substr(0, names.find(',')) << " = " << arg << " | ";
    dout(names.substr(names.find(',') + 2), args...);
}

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

template<typename A, typename B>
ostream& operator<<(ostream& out, pair<A, B> const& p) { out << "(" << p.ff << ", " << p.ss << ")"; return out; }
template<typename T>
ostream& operator<<(ostream& out, vector<T> const& v) { for (auto const& e : v) out << e << " "; return out; }
template<typename T>
ostream& operator<<(ostream& out, pair<T*,int> p) { for (;p.ss--;p.ff++) out << *p.ff << " "; return out; }

const int maxn = 1e5 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
vector<int> grafo[maxn], grafo2[maxn], ciclo;
int n, pai[maxn], ch[maxn];
bool mark[maxn], mark2[maxn], in_cycle[maxn];
int dp2[maxn][2][2], dp[maxn][2][2][2][2];

int find_cycle(int u, int p = 0) {
    mark[u] = true;
    mark2[u] = true;

    for (auto v : grafo2[u]) {
        if (v == p) continue;
        if (mark2[v]) {
            in_cycle[u] = true;
            ciclo.push_back(u);
            return v;
        } else if (!mark[v]) {
            int x = find_cycle(v, u);
            if (x) {
                if (x == -1)
                    return -1;

                in_cycle[u] = true;
                ciclo.push_back(u);
                return (x == u ? -1 : x);
            }
        }
    }

    return 0;
}

void dfs(int u) {
    for (auto v : grafo[u]) {
        if (v == pai[u]) continue;
        pai[v] = u;
        ch[u]++;
        dfs(v);
    }
}

int solve(int u, bool c, bool pc, bool c1, bool cn) {
    int& ans = dp[u][c][pc][c1][cn];
    if (ans != -1)
        return ans;

    if (u == ciclo.back()) {
        if (c != cn || (pc && c1)) return inf;
        pc |= c1;
    }
    if (ch[u] == 0)
        return pc ? c : inf;
    if (dp[u][c][pc][c1][cn] != -1)
        return dp[u][c][pc][c1][cn];

    int sum = 0;
    vector<pii> s;
    s.reserve(ch[u]);
    for (auto v : grafo[u]) {
        if (v == pai[u]) continue;
        s.push_back({v, solve(v, 0, c, c1, cn)});
        sum += s.back().ss;
    }

    ans = inf;
    if (pc) {
        ans = sum;
    } else {
        for (auto [v, d] : s) {
            ans = min(ans, sum - d + solve(v, 1, c, c1, cn));
        }
    }

    ans += c;

    ans = min(ans, inf);
    return ans;
}

int32_t main() {
    memset(dp, -1, sizeof dp);
    memset(dp2, -1, sizeof dp2);
    dfast_io;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int a, b;
        cin >> a >> b;
        grafo2[a].push_back(b);
        grafo2[b].push_back(a);
    }
    find_cycle(1);
    for (int u = 1; u <= n; u++) {
        for (auto v : grafo2[u]) {
            if (u == ciclo.front() && v == ciclo.back()) continue;
            if (v == ciclo.front() && u == ciclo.back()) continue;

            grafo[u].push_back(v);
        }
    }
    int u = ciclo.front();
    dfs(u);
    int ans = min(solve(u, 1, 0, 1, 0), solve(u, 0, 0, 0, 0));
    ans = min({ans, solve(u, 1, 1, 1, 1), solve(u, 0, 1, 0, 1)});
    cout << (ans >= inf ? -1 : ans) << '\n';

    // cin >> n;
    // for (int i = 1; i < n; i++) {
    //     int a, b;
    //     cin >> a >> b;
    //     grafo[a].push_back(b);
    //     grafo[b].push_back(a);
    // }
    // dfs(1);
    // cout << solve_tree(1, 0, 0) << '\n';
    // cout << solve_tree(1, 1, 0) << '\n';

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 20692 KB Output is correct
2 Correct 9 ms 20700 KB Output is correct
3 Correct 13 ms 20616 KB Output is correct
4 Correct 9 ms 20692 KB Output is correct
5 Correct 372 ms 51476 KB Output is correct
6 Correct 398 ms 51420 KB Output is correct
7 Correct 353 ms 51464 KB Output is correct
8 Correct 400 ms 51428 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 20712 KB Output is correct
2 Correct 10 ms 20616 KB Output is correct
3 Correct 12 ms 20580 KB Output is correct
4 Correct 10 ms 20692 KB Output is correct
5 Correct 9 ms 20692 KB Output is correct
6 Correct 9 ms 20584 KB Output is correct
7 Correct 9 ms 20580 KB Output is correct
8 Correct 10 ms 20692 KB Output is correct
9 Correct 10 ms 20692 KB Output is correct
10 Correct 10 ms 20692 KB Output is correct
11 Correct 9 ms 20704 KB Output is correct
12 Correct 9 ms 20636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 20712 KB Output is correct
2 Correct 10 ms 20616 KB Output is correct
3 Correct 12 ms 20580 KB Output is correct
4 Correct 10 ms 20692 KB Output is correct
5 Correct 9 ms 20692 KB Output is correct
6 Correct 9 ms 20584 KB Output is correct
7 Correct 9 ms 20580 KB Output is correct
8 Correct 10 ms 20692 KB Output is correct
9 Correct 10 ms 20692 KB Output is correct
10 Correct 10 ms 20692 KB Output is correct
11 Correct 9 ms 20704 KB Output is correct
12 Correct 9 ms 20636 KB Output is correct
13 Correct 11 ms 20784 KB Output is correct
14 Correct 10 ms 20692 KB Output is correct
15 Correct 11 ms 20692 KB Output is correct
16 Correct 17 ms 20760 KB Output is correct
17 Correct 10 ms 20680 KB Output is correct
18 Correct 10 ms 20784 KB Output is correct
19 Correct 10 ms 20692 KB Output is correct
20 Correct 10 ms 20692 KB Output is correct
21 Correct 9 ms 20820 KB Output is correct
22 Correct 9 ms 20756 KB Output is correct
23 Correct 10 ms 20948 KB Output is correct
24 Correct 10 ms 20896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 20692 KB Output is correct
2 Correct 9 ms 20700 KB Output is correct
3 Correct 13 ms 20616 KB Output is correct
4 Correct 9 ms 20692 KB Output is correct
5 Correct 372 ms 51476 KB Output is correct
6 Correct 398 ms 51420 KB Output is correct
7 Correct 353 ms 51464 KB Output is correct
8 Correct 400 ms 51428 KB Output is correct
9 Correct 10 ms 20712 KB Output is correct
10 Correct 10 ms 20616 KB Output is correct
11 Correct 12 ms 20580 KB Output is correct
12 Correct 10 ms 20692 KB Output is correct
13 Correct 9 ms 20692 KB Output is correct
14 Correct 9 ms 20584 KB Output is correct
15 Correct 9 ms 20580 KB Output is correct
16 Correct 10 ms 20692 KB Output is correct
17 Correct 10 ms 20692 KB Output is correct
18 Correct 10 ms 20692 KB Output is correct
19 Correct 9 ms 20704 KB Output is correct
20 Correct 9 ms 20636 KB Output is correct
21 Correct 11 ms 20784 KB Output is correct
22 Correct 10 ms 20692 KB Output is correct
23 Correct 11 ms 20692 KB Output is correct
24 Correct 17 ms 20760 KB Output is correct
25 Correct 10 ms 20680 KB Output is correct
26 Correct 10 ms 20784 KB Output is correct
27 Correct 10 ms 20692 KB Output is correct
28 Correct 10 ms 20692 KB Output is correct
29 Correct 9 ms 20820 KB Output is correct
30 Correct 9 ms 20756 KB Output is correct
31 Correct 10 ms 20948 KB Output is correct
32 Correct 10 ms 20896 KB Output is correct
33 Correct 176 ms 28812 KB Output is correct
34 Correct 163 ms 28824 KB Output is correct
35 Correct 166 ms 28804 KB Output is correct
36 Correct 177 ms 28796 KB Output is correct
37 Correct 37 ms 22732 KB Output is correct
38 Correct 162 ms 28992 KB Output is correct
39 Correct 19 ms 21428 KB Output is correct
40 Correct 181 ms 28812 KB Output is correct
41 Correct 79 ms 31076 KB Output is correct
42 Correct 89 ms 31004 KB Output is correct
43 Correct 270 ms 50604 KB Output is correct
44 Correct 175 ms 41276 KB Output is correct