답안 #289083

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
289083 2020-09-02T10:32:02 Z evpipis Mousetrap (CEOI17_mousetrap) C++11
0 / 100
55 ms 47224 KB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef pair<int, int> ii;

const int len = 1e6+5, inf = 1e9;
vector<int> adj[len], cost[len], order;
int block[len], dp[2][len];

int fix_order(int u, int p, int en){
    if (u == en){
        block[u] = 1;
        return 1;
    }

    for (auto v: adj[u]){
        if (v == p) continue;

        if (fix_order(v, u, en)){
            order.pb(u);
            block[u] = 1;
            return 1;
        }
    }

    return 0;
}

int run_dfs(int u, int p){
    int mx1 = 0, mx2 = 0, kids = 0;
    for (auto v: adj[u]){
        if (v == p) continue;

        kids++;

        int cur = run_dfs(v, u);
        if (cur > mx1)
            mx2 = mx1, mx1 = cur;
        else if (cur > mx2)
            mx2 = cur;
    }

    return mx2+kids;
}

int main(){
    freopen("trap.01.01.in", "r", stdin);

    int n, en, st;
    scanf("%d %d %d", &n, &en, &st);
    for (int i = 0; i < n-1; i++){
        int a, b;
        scanf("%d %d", &a, &b);
        adj[a].pb(b);
        adj[b].pb(a);
    }


    fix_order(st, st, en);
    reverse(order.begin(), order.end());

    for (int i = (int)order.size()-1, cnt = 0; i >= 0; i--){
        int u = order[i];

        //printf("i = %d, u = %d\n", i, u);
        for (auto v: adj[u]){
            if (block[v]) continue;

            cost[i].pb(run_dfs(v, u)+1);

            //printf("%d -> %d, cost = %d\n", u, v, cost[i].back());
        }

        sort(cost[i].begin(), cost[i].end());
        reverse(cost[i].begin(), cost[i].end());

        for (int j = (int)cost[i].size()-1; j >= 0; j--)
            cost[i][j] += cnt++;
        cost[i].pb(0);

        /*printf("i = %d\n", i);
        for (int j = 0; j < cost[i].size(); j++)
            printf("%d ", cost[i][j]);
        printf("\n");*/
    }

    for (int i = (int)order.size()-1; i >= 0; i--){
        for (int rem = 1; rem <= i+1; rem++){
            //printf("computing dp: i = %d, rem = %d\n", i, rem);

            dp[i&1][rem] = inf;
            //if (rem >= cost[i].size())
              //  dp[i&1][rem] = cost[i].size() + dp[(i+1)&1][rem-cost[i].size()+1];

            int opt = -1;
            for (int j = 0; j < cost[i].size() && j <= rem; j++){
                if (cost[i][j] >= dp[(i+1)&1][rem-j+1])
                    opt = j;

                //dp[i&1][rem] = min(dp[i&1][rem], j+max(cost[i][j], dp[(i+1)&1][rem-j+1]));
            }

            //printf("opt = %d\n", opt);

            if (opt != -1)
                dp[i&1][rem] = opt + cost[i][opt];
            else
                dp[i&1][rem] = dp[(i+1)&1][rem+1];
        }

        //printf("i = %d\n", i);
        for (int rem = 2; rem <= i+1; rem++)
            assert(dp[i&1][rem] <= dp[i&1][rem-1]);
            //printf("rem = %d, dp = %d\n", rem, dp[i&1][rem]);
    }

    printf("%d\n", dp[0][1]);
    return 0;
}

Compilation message

mousetrap.cpp: In function 'int main()':
mousetrap.cpp:100:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |             for (int j = 0; j < cost[i].size() && j <= rem; j++){
      |                             ~~^~~~~~~~~~~~~~~~
mousetrap.cpp:51:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   51 |     freopen("trap.01.01.in", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   54 |     scanf("%d %d %d", &n, &en, &st);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:57:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   57 |         scanf("%d %d", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 32 ms 47224 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 55 ms 47224 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 32 ms 47224 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 32 ms 47224 KB Output isn't correct
2 Halted 0 ms 0 KB -