QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#631441 | #277. Beads and wires | makrav | 13 | 22ms | 14424kb | C++20 | 4.4kb | 2024-10-12 03:52:44 | 2024-10-12 03:52:44 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define pb push_back
#define ff first
#define sc second
#define int ll
void solve() {
int n; cin >> n;
vector<vector<pair<int, int>>> g(n);
int s = 0;
for (int i = 0; i < n - 1; i++) {
int u, v, w; cin >> u >> v >> w;
u--; v--;
g[u].pb({v, w});
g[v].pb({u, w});
s += w;
}
vector<vector<vector<int>>> dp(n, vector<vector<int>>(2, vector<int>(2, 2e9 + 1)));
// 0 - vertex, 1 - edge
auto dfs = [&](int v, int p, auto&&self) -> void {
int s00 = 0, md00 = 2e9 + 1;
vector<int> ds2;
vector<int> dsf01, sons;
int S = 0;
for (auto &[u, w] : g[v]) {
if (u != p) {
S++;
self(u, v, self);
sons.pb(u);
int nd00 = min(dp[u][1][0], w + min(dp[u][0][0], dp[u][0][1]));
s00 += nd00;
int nd01 = dp[u][1][1];
md00 = min(md00, nd01 - nd00);
ds2.pb(nd01 - nd00);
int nd10 = dp[u][0][0];
dsf01.pb(nd10 - nd00);
//if (v == 0) cout << u + 1 << ' ' << nd10 << ' ' << nd00 << '\n';
}
}
dp[v][0][0] = s00; // = sum by all sons dpnew[u][0][0]
dp[v][0][1] = s00 + md00; // one can be dpnew[u][0][1]
vector<int> ordd(S);
iota(all(ordd), 0);
sort(all(ordd), [&](int s1, int s2) {
return dsf01[s1] < dsf01[s2];
});
// if (v == 0) {
// cout << "-------\n";
// for (auto &u : sons) cout << u << ' ';
// cout << '\n';
// for (auto &u : dsf01) cout << u << ' ';
// cout << '\n';
// for (auto &u : ordd) cout << u << ' ';
// cout << '\n';
// cout << "-------\n";
// }
if (dsf01.size() >= 2) {
dp[v][0][1] = min(dp[v][0][1], s00 + dsf01[ordd[0]] + dsf01[ordd[1]]);
for (auto [son, w] : g[v]) {
if (son == p) continue;
int val = dp[son][0][1];
int v2 = val + s00 - min(dp[son][1][0], w + min(dp[son][0][0], dp[son][0][1]));
//if (v == 0) cout << "fuck1 " << v2 << '\n';
if (sons[ordd[0]] == son) {
v2 += dsf01[ordd[1]];
//if (v == 0) cout << "fuckkxd " << ordd[1] << " ff " << sons[ordd[1]] << '\n';
} else {
//if (v == 0) cout << "fuckkxd " << sons[ordd[0]] << '\n';
v2 += dsf01[ordd[0]];
}
//if (v == 0) cout << son + 1 << ' ' << v2 << "fuck\n";
dp[v][0][1] = min(dp[v][0][1], v2);
}
}
dp[v][1][0] = (dsf01.size() == 0 ? 2e9 + 1 : s00 + dsf01[ordd[0]]);
vector<int> order(sz(sons));
iota(all(order), 0);
sort(all(order), [&](int s1, int s2) {
return ds2[s1] < ds2[s2];
});
if (S == 1) {
for (auto &[u, w] : g[v]) {
if (u != p) {
dp[v][1][1] = dp[u][0][1];
}
}
}
else {
for (auto &[u, w] : g[v]) {
if (u != p) {
dp[v][1][1] = min(dp[v][1][1], dp[u][0][1] + s00 - min(dp[u][1][0], w + min(dp[u][0][0], dp[u][0][1])));
//dp[v][1][1] = min(dp[v][1][1], dp[u][0][0] + s00 - min(dp[u][1][0], w + min(dp[u][0][0], dp[u][0][1])) +
//(sons[order[0]] == u ? ds2[order[1]] : ds2[order[0]]));
//if (v == 1) cout << u << ' ' << dp[v][1][1] << '\n';
}
}
}
//cout << v + 1 << ' ' << dp[v][0][0] << ' ' << dp[v][0][1] << ' ' << dp[v][1][0] << ' ' << dp[v][1][1] << '\n';
};
dfs(0, 0, dfs);
cout << s - min(dp[0][0][0], dp[0][0][1]) << '\n';
}
signed main() {
int tt = 1;
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
cin >> tt;
#else
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
#endif
while (tt--) {
solve();
}
return 0;
}
详细
Subtask #1:
score: 13
Accepted
Test #1:
score: 13
Accepted
time: 0ms
memory: 3860kb
input:
5 1 2 10 1 3 40 1 4 15 1 5 20
output:
60
result:
ok single line: '60'
Test #2:
score: 13
Accepted
time: 0ms
memory: 3844kb
input:
10 4 10 2 1 2 21 1 3 13 6 7 1 7 9 5 2 4 3 2 5 8 1 6 55 6 8 34
output:
140
result:
ok single line: '140'
Test #3:
score: 13
Accepted
time: 0ms
memory: 3652kb
input:
10 4 10 5 1 10 7 3 10 10 3 9 10 2 3 5 3 8 9 7 10 3 5 8 9 4 6 6
output:
61
result:
ok single line: '61'
Test #4:
score: 13
Accepted
time: 0ms
memory: 3556kb
input:
10 7 10 1 2 7 3 6 7 5 1 9 5 5 7 3 2 3 3 3 4 3 2 9 5 6 8 3
output:
30
result:
ok single line: '30'
Test #5:
score: 13
Accepted
time: 0ms
memory: 3820kb
input:
10 3 10 6 3 7 6 8 9 3 1 5 1 2 10 4 4 10 2 1 8 6 1 10 10 6 9 7
output:
44
result:
ok single line: '44'
Test #6:
score: 13
Accepted
time: 0ms
memory: 3860kb
input:
10 5 6 9 2 3 5 1 10 8 4 5 9 2 7 8 5 7 10 6 9 4 2 8 9 1 7 5
output:
62
result:
ok single line: '62'
Test #7:
score: 13
Accepted
time: 0ms
memory: 3616kb
input:
10 2 3 7 6 9 7 2 10 6 4 9 2 2 8 5 1 6 1 6 7 10 6 8 9 2 5 6
output:
41
result:
ok single line: '41'
Test #8:
score: 13
Accepted
time: 0ms
memory: 3560kb
input:
10 7 9 1 3 5 9 1 6 3 5 9 3 5 8 10 6 10 9 2 5 3 2 4 10 8 10 6
output:
53
result:
ok single line: '53'
Test #9:
score: 13
Accepted
time: 0ms
memory: 3504kb
input:
10 3 6 9 2 5 5 2 4 1 4 9 2 5 7 7 2 10 3 5 6 10 1 2 6 5 8 3
output:
43
result:
ok single line: '43'
Test #10:
score: 13
Accepted
time: 0ms
memory: 3520kb
input:
10 2 3 4 4 8 9 1 8 2 2 4 6 4 5 7 4 7 4 2 10 6 4 9 1 6 7 1
output:
39
result:
ok single line: '39'
Test #11:
score: 13
Accepted
time: 0ms
memory: 3624kb
input:
10 1 8 4 2 3 7 3 10 4 2 4 7 6 7 5 3 7 7 7 9 10 5 9 6 3 8 2
output:
48
result:
ok single line: '48'
Test #12:
score: 13
Accepted
time: 0ms
memory: 3624kb
input:
10 8 9 7 2 3 8 2 6 5 2 9 1 2 10 3 5 9 3 4 5 3 7 8 9 1 2 2
output:
35
result:
ok single line: '35'
Subtask #2:
score: 0
Wrong Answer
Test #13:
score: 0
Wrong Answer
time: 0ms
memory: 3580kb
input:
100 48 93 4 12 87 1 27 72 10 3 43 2 33 86 2 37 80 8 51 98 4 34 57 3 5 51 7 15 100 9 41 72 4 14 30 10 27 80 7 50 71 7 6 77 6 36 66 1 47 61 2 71 92 7 20 94 7 3 59 1 55 69 7 16 33 5 71 79 6 18 96 4 4 43 3 1 55 4 65 75 10 82 96 2 30 74 9 12 19 6 46 93 1 83 94 9 22 24 1 27 51 9 33 92 4 25 42 10 71 81 8 3...
output:
446
result:
wrong answer 1st lines differ - expected: '441', found: '446'
Subtask #3:
score: 0
Wrong Answer
Test #23:
score: 0
Wrong Answer
time: 3ms
memory: 4684kb
input:
5000 2198 4992 964 2521 2711 961 3408 4585 975 2746 3304 974 2514 3411 972 602 4079 952 1193 3742 996 774 4530 942 2234 3877 905 346 1537 959 886 3841 937 3126 3342 938 211 2423 977 1725 4740 944 2125 4020 961 1235 3070 903 3109 4669 970 3923 4815 972 2525 4784 979 1159 1511 968 1900 3573 960 2087 2...
output:
3856928
result:
wrong answer 1st lines differ - expected: '3848169', found: '3856928'
Subtask #4:
score: 0
Wrong Answer
Test #32:
score: 0
Wrong Answer
time: 22ms
memory: 14424kb
input:
50000 22758 25880 990 917 25140 901 10537 30620 913 10368 14209 993 40077 48077 900 5064 20728 937 39641 39844 906 819 11079 965 12203 41474 993 13965 27792 923 20713 39385 991 4266 46545 938 27293 40442 937 12696 27693 961 10394 24153 998 24393 26653 926 25825 32799 963 33049 38343 946 15252 41731 ...
output:
38577275
result:
wrong answer 1st lines differ - expected: '38479584', found: '38577275'