QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#778453 | #6437. Paimon's Tree | FUCKUCUP | WA | 72ms | 20196kb | C++20 | 2.6kb | 2024-11-24 14:42:59 | 2024-11-24 14:43:06 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int maxn = 160;
int T, n, a[maxn], dep[maxn], siz[maxn];
long long dp[maxn][maxn][maxn][4];
vector<int> g[maxn];
void dfs(int u, int pre) {
siz[u] = 1, dep[u] = dep[pre] + 1;
for(auto &v : g[u]) if(v != pre) dfs(v, u), siz[u] += siz[v];
}
void dfs2(int u, int pre, int x, int y) {
if(u == y) {
int mx = 0;
for(int i = 0; i <= n; ++i) mx = max(mx, a[i]), dp[x][u][i][0] = mx;
for(int i = 0; i <= siz[y] - 1; ++i) dp[x][u][i][1] = 0;
for(int i = 0; i <= n - siz[u]; ++i) dp[x][u][i][2] = 0;
} else {
if(pre == y) dp[x][u][0][3] = 0;
for (int i = 1; i <= n; ++i) {
dp[x][u][i][0] = max(dp[x][u][i - 1][0], max(dp[x][u][i - 1][1], dp[x][u][i - 1][2]) + a[i]);
dp[x][u][i][1] = dp[x][u][i - 1][3] + a[i];
if (siz[y] - 1 >= i) dp[x][u][i][1] = max(dp[x][u][i][1], dp[x][u][i - 1][1]);
dp[x][u][i][2] = dp[x][u][i - 1][3] + a[i];
if (n - siz[u] >= i) dp[x][u][i][2] = max(dp[x][u][i][2], dp[x][u][i - 1][2]);
dp[x][u][i][3] = max(dp[y][u][i - 1][3], dp[x][pre][i - 1][3]) + a[i];
if (siz[y] - siz[u] - 1 >= i) dp[x][u][i][3] = max(dp[x][u][i][3], dp[x][u][i - 1][3]);
}
}
for(auto &v : g[u]) if(v != pre) dfs2(v, u, x, y);
}
inline void solve() {
cin >> n;
for(int i = 1; i <= n; ++i) cin >> a[i];
for(int i = 1; i <= n + 1; ++i) g[i].clear();
for(int i = 1; i <= n; ++i) {
int u, v; cin >> u >> v;
g[u].push_back(v), g[v].push_back(u);
}
for(int u = 1; u <= n + 1; ++u) for(int v = 1; v <= n + 1; ++v) for(int i = 0; i <= n; ++i) memset(dp[u][v][i], -0x3f, sizeof dp[u][v][i]);
for(int u = 1; u <= n + 1; ++u) for(int i = 1; i <= n; ++i) dp[u][u][i][0] = 0;
for(int u = 1; u <= n + 1; ++u) {
dfs(u, 0);
for(auto &v : g[u]) dfs2(v, u, u, v);
}
long long ans = 0;
for(int u = 1; u <= n + 1; ++u) for(int v = 1; v <= n + 1; ++v) ans = max(ans, dp[u][v][n][0]);
cout << ans << '\n';
// for(int u = 1; u <= n; ++u) for(int v = 1; v <= n; ++v) {
// cout << u << ' ' << v << ":\n";
// for(int i = 0; i <= n; ++i) cout << (dp[u][v][i][0] < 0 ? -1 : dp[u][v][i][0]) << ' '; cout << '\n';
// for(int i = 0; i <= n; ++i) cout << (dp[u][v][i][1] < 0 ? -1 : dp[u][v][i][1]) << ' '; cout << '\n';
// for(int i = 0; i <= n; ++i) cout << (dp[u][v][i][2] < 0 ? -1 : dp[u][v][i][2]) << ' '; cout << '\n';
// for(int i = 0; i <= n; ++i) cout << (dp[u][v][i][3] < 0 ? -1 : dp[u][v][i][3]) << ' '; cout << '\n';
// }
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> T;
while(T--) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 7824kb
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: 72ms
memory: 20196kb
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 7303703112 4890256216 2355946110 3090496776 5626636202 4729664767 2207592767 572868833 4759005973 2944749369 2538044586 3083947956 5534713385 1421427135 3971435093 1197051728 396588615 251138097 221986...
result:
wrong answer 10th numbers differ - expected: '7807375141', found: '7303703112'