답안 #1066142

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1066142 2024-08-19T15:21:48 Z _callmelucian Chase (CEOI17_chase) C++14
100 / 100
2731 ms 39064 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pl;
typedef pair<int,int> pii;
typedef tuple<int,int,int> tt;

#define all(a) a.begin(), a.end()
#define filter(a) a.erase(unique(all(a)), a.end())

const int mn = 1e5 + 5;
ll pigeon[mn], neighbour[mn], dpDown[2][2][mn], dpUp[2][2][mn], dpExcept[2][2][mn];
vector<int> adj[mn];

struct helper {
    vector<ll> pre, sfx;
    int n;

    helper (vector<ll> a) : pre(a.size()), sfx(a.size()), n(a.size()) {
        if (!n) return;
        pre[0] = a[0], sfx[n - 1] = a[n - 1];
        for (int i = 1; i < n; i++)
            pre[i] = max(pre[i - 1], a[i]);
        for (int i = n - 2; i >= 0; i--)
            sfx[i] = max(sfx[i + 1], a[i]);
    }

    ll getPre (int p) {
        return (0 <= p && p < n ? pre[p] : 0);
    }

    ll getSfx (int p) {
        return (0 <= p && p < n ? sfx[p] : 0);
    }

    ll query (int exc = -1) {
        if (exc == -1) return getPre(n - 1);
        return max(getPre(exc - 1), getSfx(exc + 1));
    }
};

void dfsDown (int u, int p, int bread) {
    int t = bread & 1;

    vector<ll> v1(adj[u].size()), v2(adj[u].size());
    for (int i = 0; i < adj[u].size(); i++) {
        int v = adj[u][i]; if (v == p) continue;
        dfsDown(v, u, bread);
        v1[i] = max(dpDown[t ^ 1][1][v] - pigeon[u], dpDown[t ^ 1][0][v]);
        v2[i] = max(dpDown[t][1][v] - pigeon[u], dpDown[t][0][v]);
    }
    helper take(v1), ignore(v2);

    dpDown[t][1][u] = take.query() + neighbour[u];
    dpDown[t][0][u] = ignore.query();
    for (int i = 0; i < adj[u].size(); i++) {
        int v = adj[u][i]; if (v == p) continue;
        dpExcept[t][1][v] = take.query(i) + neighbour[u];
        dpExcept[t][0][v] = ignore.query(i);
    }
}

void dfsUp (int u, int p, int bread) {
    int t = bread & 1;
    dpUp[t][1][u] = neighbour[u];
    if (u != p) {
        ll take = max({dpUp[t ^ 1][1][p] - pigeon[u], dpUp[t ^ 1][0][p], dpExcept[t ^ 1][1][u] - pigeon[u], dpExcept[t ^ 1][0][u]});
        ll ignore = max({dpUp[t][1][p] - pigeon[u], dpUp[t][0][p], dpExcept[t][1][u] - pigeon[u], dpExcept[t][0][u]});
        dpUp[t][1][u] = take + neighbour[u], dpUp[t][0][u] = ignore;
    }

    for (int v : adj[u])
        if (v != p) dfsUp(v, u, bread);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, v; cin >> n >> v;
    for (int i = 1; i <= n; i++) cin >> pigeon[i];
    for (int i = 1; i < n; i++) {
        int a, b; cin >> a >> b;
        neighbour[a] += pigeon[b];
        neighbour[b] += pigeon[a];
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    if (v == 0) return cout << 0, 0;

    for (int i = 1; i <= v; i++) {
        dfsDown(1, 1, i);
        dfsUp(1, 1, i);
    }

    ll ans = 0;
    for (int i = 1; i <= n; i++)
        ans = max({ans, dpDown[v & 1][1][i], dpUp[v & 1][1][i]});
    cout << ans;

    return 0;
}

Compilation message

chase.cpp: In function 'void dfsDown(int, int, int)':
chase.cpp:48:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |     for (int i = 0; i < adj[u].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~
chase.cpp:58:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |     for (int i = 0; i < adj[u].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2652 KB Output is correct
2 Correct 2 ms 2652 KB Output is correct
3 Correct 2 ms 2652 KB Output is correct
4 Correct 1 ms 2652 KB Output is correct
5 Correct 1 ms 2652 KB Output is correct
6 Correct 1 ms 2652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2652 KB Output is correct
2 Correct 2 ms 2652 KB Output is correct
3 Correct 2 ms 2652 KB Output is correct
4 Correct 1 ms 2652 KB Output is correct
5 Correct 1 ms 2652 KB Output is correct
6 Correct 1 ms 2652 KB Output is correct
7 Correct 17 ms 3500 KB Output is correct
8 Correct 3 ms 3164 KB Output is correct
9 Correct 2 ms 2908 KB Output is correct
10 Correct 21 ms 3060 KB Output is correct
11 Correct 6 ms 3160 KB Output is correct
12 Correct 3 ms 2892 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2605 ms 38880 KB Output is correct
2 Correct 2468 ms 38740 KB Output is correct
3 Correct 1416 ms 25016 KB Output is correct
4 Correct 62 ms 14416 KB Output is correct
5 Correct 2506 ms 19004 KB Output is correct
6 Correct 2627 ms 19028 KB Output is correct
7 Correct 2643 ms 19024 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2652 KB Output is correct
2 Correct 2 ms 2652 KB Output is correct
3 Correct 2 ms 2652 KB Output is correct
4 Correct 1 ms 2652 KB Output is correct
5 Correct 1 ms 2652 KB Output is correct
6 Correct 1 ms 2652 KB Output is correct
7 Correct 17 ms 3500 KB Output is correct
8 Correct 3 ms 3164 KB Output is correct
9 Correct 2 ms 2908 KB Output is correct
10 Correct 21 ms 3060 KB Output is correct
11 Correct 6 ms 3160 KB Output is correct
12 Correct 3 ms 2892 KB Output is correct
13 Correct 2605 ms 38880 KB Output is correct
14 Correct 2468 ms 38740 KB Output is correct
15 Correct 1416 ms 25016 KB Output is correct
16 Correct 62 ms 14416 KB Output is correct
17 Correct 2506 ms 19004 KB Output is correct
18 Correct 2627 ms 19028 KB Output is correct
19 Correct 2643 ms 19024 KB Output is correct
20 Correct 2657 ms 19092 KB Output is correct
21 Correct 26 ms 9556 KB Output is correct
22 Correct 2662 ms 19024 KB Output is correct
23 Correct 65 ms 14420 KB Output is correct
24 Correct 2512 ms 19092 KB Output is correct
25 Correct 1448 ms 24496 KB Output is correct
26 Correct 2731 ms 38996 KB Output is correct
27 Correct 2600 ms 39064 KB Output is correct