답안 #738415

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
738415 2023-05-08T17:19:40 Z GrindMachine Museum (CEOI17_museum) C++17
100 / 100
666 ms 785308 KB
// Om Namah Shivaya

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long int ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define pb push_back
#define endl '\n'
#define sz(a) a.size()
#define setbits(x) __builtin_popcountll(x)
#define ff first
#define ss second
#define conts continue
#define ceil2(x, y) ((x + y - 1) / (y))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "Yes" << endl
#define no cout << "No" << endl

#define rep(i, n) for(int i = 0; i < n; ++i)
#define rep1(i, n) for(int i = 1; i <= n; ++i)
#define rev(i, s, e) for(int i = s; i >= e; --i)
#define trav(i, a) for(auto &i : a)

template<typename T>
void amin(T &a, T b) {
    a = min(a, b);
}

template<typename T>
void amax(T &a, T b) {
    a = max(a, b);
}

#ifdef LOCAL
#include "debug.h"
#else
#define debug(x) 42
#endif

/*



*/

const int MOD = 1e9 + 7;
const int N = 1e4 + 5;
const int inf1 = int(1e9) + 5;
const ll inf2 = ll(1e18) + 5;
const int K = 1e4 + 5;

vector<pii> adj[N];
vector<int> subsiz(N);
int dp[N][K][2];
int dp2[K][2], dp3[K][2];
int k;

void dfs1(int u, int p) {
    subsiz[u] = 1;

    for (auto [v, w] : adj[u]) {
        if (v == p) conts;
        dfs1(v, u);
        subsiz[u] += subsiz[v];
    }
}

void dfs2(int u, int p) {
    for (auto [v, w] : adj[u]) {
        if (v == p) conts;
        dfs2(v, u);
    }

    dp[u][1][1] = 0;
    int curr_siz = 1;

    for (auto [v, w] : adj[u]) {
        if (v == p) conts;

        rev(j1, curr_siz, 1) {
            rep1(j2, subsiz[v]) {
                amin(dp[u][j1 + j2][1], dp[u][j1][1] + dp[v][j2][1] + 2 * w);
            }
        }

        curr_siz += subsiz[v];
    }

    memset(dp2, 0x3f, sizeof dp2);
    memset(dp3, 0x3f, sizeof dp3);
    dp2[1][0] = 0;

    curr_siz = 1;

    for (auto [v, w] : adj[u]) {
        if (v == p) conts;

        rev(j1, curr_siz, 1) {
            rep1(j2, subsiz[v]) {
                rep(t1, 2) {
                    rep(t2, 2) {
                        int t3 = t1 + (t2 ^ 1);
                        if (t3 >= 2) conts;

                        int cost = dp[v][j2][t2];
                        if (t2) cost += 2 * w;
                        else cost += w;

                        amin(dp3[j1 + j2][t3], dp2[j1][t1] + cost);
                    }
                }
            }
        }

        curr_siz += subsiz[v];

        rep1(j, curr_siz) {
            rep(t, 2) {
                amin(dp2[j][t], dp3[j][t]);
                dp3[j][t] = inf1;
            }
        }
    }

    rep1(j, curr_siz) {
        dp[u][j][0] = min(dp2[j][0], dp2[j][1]);
    }
}

void solve(int test_case)
{
    int n, r; cin >> n >> k >> r;
    rep1(i, n - 1) {
        int u, v, w; cin >> u >> v >> w;
        adj[u].pb({v, w}), adj[v].pb({u, w});
    }

    memset(dp, 0x3f, sizeof dp);

    dfs1(r, -1);
    dfs2(r, -1);

    int ans = dp[r][k][0];
    cout << ans << endl;
}

int main()
{
    fastio;

    int t = 1;
    // cin >> t;

    rep1(i, t) {
        solve(i);
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 326 ms 784388 KB Output is correct
2 Correct 327 ms 784204 KB Output is correct
3 Correct 293 ms 784280 KB Output is correct
4 Correct 322 ms 784224 KB Output is correct
5 Correct 284 ms 784288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 512 ms 784832 KB Output is correct
2 Correct 534 ms 784852 KB Output is correct
3 Correct 558 ms 785228 KB Output is correct
4 Correct 533 ms 785032 KB Output is correct
5 Correct 555 ms 784844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 512 ms 784832 KB Output is correct
2 Correct 534 ms 784852 KB Output is correct
3 Correct 558 ms 785228 KB Output is correct
4 Correct 533 ms 785032 KB Output is correct
5 Correct 555 ms 784844 KB Output is correct
6 Correct 516 ms 784748 KB Output is correct
7 Correct 573 ms 785096 KB Output is correct
8 Correct 650 ms 784796 KB Output is correct
9 Correct 666 ms 784956 KB Output is correct
10 Correct 540 ms 784928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 326 ms 784388 KB Output is correct
2 Correct 327 ms 784204 KB Output is correct
3 Correct 293 ms 784280 KB Output is correct
4 Correct 322 ms 784224 KB Output is correct
5 Correct 284 ms 784288 KB Output is correct
6 Correct 512 ms 784832 KB Output is correct
7 Correct 534 ms 784852 KB Output is correct
8 Correct 558 ms 785228 KB Output is correct
9 Correct 533 ms 785032 KB Output is correct
10 Correct 555 ms 784844 KB Output is correct
11 Correct 516 ms 784748 KB Output is correct
12 Correct 573 ms 785096 KB Output is correct
13 Correct 650 ms 784796 KB Output is correct
14 Correct 666 ms 784956 KB Output is correct
15 Correct 540 ms 784928 KB Output is correct
16 Correct 547 ms 784844 KB Output is correct
17 Correct 501 ms 784772 KB Output is correct
18 Correct 602 ms 785016 KB Output is correct
19 Correct 630 ms 784872 KB Output is correct
20 Correct 537 ms 784972 KB Output is correct
21 Correct 562 ms 785308 KB Output is correct
22 Correct 510 ms 784804 KB Output is correct
23 Correct 607 ms 784840 KB Output is correct
24 Correct 514 ms 784888 KB Output is correct
25 Correct 567 ms 785244 KB Output is correct