QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#654851#6437. Paimon's TreellleiWA 239ms3876kbC++203.6kb2024-10-18 22:35:242024-10-18 22:35:25

Judging History

你现在查看的是最新测评结果

  • [2024-10-18 22:35:25]
  • 评测
  • 测评结果:WA
  • 用时:239ms
  • 内存:3876kb
  • [2024-10-18 22:35:24]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using LL = long long;

void solve() {
    int n;
    cin >> n;

    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    vector<vector<int>> e(n + 1);
    for (int i = 0; i < n; ++i) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        e[u].push_back(v);
        e[v].push_back(u);
    }

    vector<vector<array<int, 2>>> b(n + 2);
    vector len(n + 1, vector<int>(n + 1));

    int s = -1;
    auto dfs = [&](auto &&self, int u, int fa, int len1) -> void {
        for (int v : e[u]) {
            if (v == fa) {
                continue;
            }
            if (s < v) {
                b[len1 + 1].push_back({s, v});
                len[s][v] = len1 + 1;
            }
            self(self, v, u, len1 + 1);
        }
    };

    for (int i = 0; i <= n; ++i) {
        b[1].push_back({i, i});
    }
    for (int i = 0; i <= n; ++i) {
        s = i;
        dfs(dfs, i, -1, 1);
    }

    vector f(n + 1, vector(n + 1, vector<LL>(n + 1, -1)));

    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= n; ++j) {
            f[i][i][j] = 0;
        }
    }

    int cnt = 0;
    bool flag = false;
    int vv = -1;
    auto dfs1 = [&](auto &&self, int u, int fa) -> void {
        ++cnt;
        if (u == vv) {
            flag = true;
        }
        for (int v : e[u]) {
            if (v == fa) {
                continue;
            }
            self(self, v, u);
        }
    };

    auto myMx = [&](auto &x, const auto &y) {
        if (x < y) {
            x = y;
        }
    };

    for (int l = 1; l <= n; ++l) {
        for (auto [u, v] : b[l]) {
            vv = v;
            for (int vv : e[u]) {
                cnt = 0;
                dfs1(dfs1, vv, u);
                if (flag) {
                    flag = false;
                    continue;
                }
                int u1 = v, v1 = vv;
                if (u1 > v1) {
                    swap(u1, v1);
                }

                for (int i = 0; i <= n; ++i) {
                    if (n - cnt >= i && f[u][v][i] != -1) {
                        myMx(f[u1][v1][i + 1], f[u][v][i] + a[i]);
                    }
                }

                for (int i = 0; i <= n - 1; ++i) {
                    myMx(f[u1][v1][i + 1], f[u1][v1][i]);
                }
            }
            
            vv = u;
            for (int vv : e[v]) {
                cnt = 0;
                dfs1(dfs1, vv, v);
                if (flag) {
                    flag = false;
                    continue;
                }
                int u1 = u, v1 = vv;
                if (u1 > v1) {
                    swap(u1, v1);
                }

                for (int i = 0; i <= n; ++i) {
                    if (n - cnt >= i && f[u][v][i] != -1) {
                        myMx(f[u1][v1][i + 1], f[u][v][i] + a[i]);
                    }
                }

                for (int i = 0; i <= n - 1; ++i) {
                    myMx(f[u1][v1][i + 1], f[u1][v1][i]);
                }
            }
        }
    }

    LL ans = 0;
    for (int i=  0; i <= n; ++i) {
        for (int j = i; j <= n;++j) {
            for (int k = 0; k <= n; ++k) {
                ans = max(ans, f[i][j][k]);
            }
        }
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

/*
1
1
1000000000
1 2

1
5
1 7 3 5 4
1 3
2 3
3 4
4 5
4 6
*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3876kb

input:

2
5
1 7 3 5 4
1 3
2 3
3 4
4 5
4 6
1
1000000000
1 2

output:

16
1000000000

result:

ok 2 number(s): "16 1000000000"

Test #2:

score: -100
Wrong Answer
time: 239ms
memory: 3800kb

input:

5000
19
481199252 336470888 634074578 642802746 740396295 773386884 579721198 396628655 503722503 971207868 202647942 2087506 268792718 46761498 443917727 16843338 125908043 691952768 717268783
9 4
4 18
12 9
10 9
4 1
6 12
2 18
9 13
6 14
4 8
2 3
10 17
2 20
19 20
5 1
12 15
15 16
4 7
17 11
4
240982681 ...

output:

5750811120
1896999359
4208559611
4140156713
5361004844
1875024569
3690026656
3702623113
3412485417
7807375141
5341435147
2355946110
3090496776
5626636202
4729664767
2207592767
572868833
4759005973
2944749369
2538044586
3083947956
5757497518
1421427135
3971435093
1197051728
396588615
251138097
221986...

result:

wrong answer 48th numbers differ - expected: '5317528311', found: '5514819848'