답안 #57886

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
57886 2018-07-16T13:28:25 Z gabrielsimoes Chase (CEOI17_chase) C++17
0 / 100
4000 ms 251932 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int MAXN = 1e5+10, MAXV = 101;

int n, vMax;
int p[MAXN];
vector<int> g[MAXN];
int a[MAXN], b[MAXN];

ll dp[MAXN][MAXV][3];
ll f(int curEdge, int v, int dir) {
    if (v == 0) return 0;

    ll &ret = dp[curEdge][v][dir];
    if (ret != -1) return ret;
    ret = 0;

    int cur, prev;
    if (dir == 0) cur = curEdge, prev = -1;
    else if (dir == 1) prev = a[curEdge], cur = b[curEdge];
    else cur = a[curEdge], prev = b[curEdge];

    int sumAll = 0;
    for (int edge : g[cur]) {
        int nx = a[edge] == cur ? b[edge] : a[edge];
        if (nx != prev) {
            sumAll += p[nx];
        }
    }

    for (int edge : g[cur]) {
        int nx = a[edge] == cur ? b[edge] : a[edge];
        if (nx != prev) {
            int dir = (cur == a[edge] ? 1 : 2);
            ret = max(ret, max(f(edge, v, dir),
                               f(edge, v-1, dir) + sumAll));
        }
    }

    // printf("dp %-2d %-2d %-2d == %lld\n", curEdge, v, dir, ret);
    // printf("dp: cur %-2d prev %-2d v %-2d == %lld\n", cur, prev, v, ret);
    return ret;
}

int main() {
    memset(dp, -1, sizeof(dp));

    scanf("%d%d", &n, &vMax);
    for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
    for (int i = 1; i < n; i++) {
        scanf("%d%d", &a[i], &b[i]);
        g[a[i]].push_back(i);
        g[b[i]].push_back(i);
    }

    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        ans = max(ans, f(i, vMax, 0));
    }

    printf("%lld\n", ans);
}

Compilation message

chase.cpp: In function 'int main()':
chase.cpp:50:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &vMax);
     ~~~~~^~~~~~~~~~~~~~~~~~~
chase.cpp:51:39: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
                                  ~~~~~^~~~~~~~~~~~~
chase.cpp:53:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &a[i], &b[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 296 ms 239868 KB Output is correct
2 Correct 211 ms 239984 KB Output is correct
3 Incorrect 182 ms 239984 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 296 ms 239868 KB Output is correct
2 Correct 211 ms 239984 KB Output is correct
3 Incorrect 182 ms 239984 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4101 ms 251932 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 296 ms 239868 KB Output is correct
2 Correct 211 ms 239984 KB Output is correct
3 Incorrect 182 ms 239984 KB Output isn't correct
4 Halted 0 ms 0 KB -