Submission #960920

#TimeUsernameProblemLanguageResultExecution timeMemory
960920GhettoChase (CEOI17_chase)C++17
40 / 100
4035 ms42248 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("03", "unroll-loops")
#pragma GCC target("avx2", "bmi", "bmi2", "lzcnt", "popcnt")
using namespace std;
using pii = pair<int, int>;
using lint = long long;
const int MAX_N = 1e5 + 5, MAX_K = 1e2 + 5;

int n, k;
lint val[MAX_N];
vector<int> adj[MAX_N], adj_ind[MAX_N]; // adj_ind[u][i] = ind of adj list u is for adj[u][i]
void init() {
    for (int i = 1; i <= n; i++) {
        adj[i].push_back(0);
        adj_ind[i].push_back(0);
    }
}

vector<int> seen[MAX_N];
vector<pii> topo_order;
void dfs(int u, int prev) {
    seen[u][prev] = 1;
    for (int i = 1; i < adj[u].size(); i++) {
        if (i == prev) continue;
        int v = adj[u][i];
        if (seen[v][adj_ind[u][i]] == 1) assert(true == false);
        if (!seen[v][adj_ind[u][i]]) dfs(v, adj_ind[u][i]);
    }
    seen[u][prev] = 2;
    topo_order.push_back({u, prev});
}

vector<lint> dp[MAX_N][2];
void precomp() {
    for (int i = 1; i <= n; i++)
        seen[i].resize(adj[i].size() + 2);
    
    for (int i = 1; i <= n; i++)
        dfs(i, 0);
    reverse(topo_order.begin(), topo_order.end());

    for (int i = 1; i <= n; i++) {
        for (int c = 0; c <= 1; c++) {
            dp[i][c].resize(adj[i].size() + 2);
        }
    }
}

int main() {
    // freopen("chase.in", "r", stdin);

    cin.sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> k;
    init();

    for (int i = 1; i <= n; i++) cin >> val[i];
    for (int i = 1; i < n; i++) {
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);

        int u_ind = adj[u].size() - 1, v_ind = adj[v].size() - 1;
        adj_ind[u].push_back(v_ind);
        adj_ind[v].push_back(u_ind);
    }

    precomp();

    assert(topo_order.size() <= 3e5);
    for (int c = 1; c <= k; c++) {
        int p = c % 2, opp_p = (c + 1) % 2;

        for (int j = topo_order.size() - 1; j >= 0; j--) {
            int u = topo_order[j].first, prev = topo_order[j].second;

            lint leave = 0;
            for (int i = 1; i < adj[u].size(); i++)
                if (i != prev) leave = max(leave, dp[adj[u][i]][p][adj_ind[u][i]]);

            lint take = 0;
            for (int i = 1; i < adj[u].size(); i++)
                if (i != prev) take = max(take, dp[adj[u][i]][opp_p][adj_ind[u][i]]);
            for (int i = 1; i < adj[u].size(); i++)
                if (i != prev) take += val[adj[u][i]];
            
            dp[u][p][prev] = max(take, leave);
        }
    }

    lint ans = 0;
    for (int i = 1; i <= n; i++) ans = max(ans, dp[i][k % 2][0]);
    cout << ans << '\n';
}

Compilation message (stderr)

chase.cpp: In function 'void dfs(int, int)':
chase.cpp:23:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |     for (int i = 1; i < adj[u].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~
chase.cpp: In function 'int main()':
chase.cpp:79:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |             for (int i = 1; i < adj[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~~~
chase.cpp:83:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |             for (int i = 1; i < adj[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~~~
chase.cpp:85:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   85 |             for (int i = 1; i < adj[u].size(); i++)
      |                             ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...