QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#186572 | #6738. Cover | UrgantTeam | AC ✓ | 2788ms | 256760kb | C++23 | 4.6kb | 2023-09-24 03:41:56 | 2023-09-24 03:41:56 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int const maxn = 1e5 + 5, logg = 17, K = 12;
vector < int > g[maxn];
vector < int > G[maxn];
vector < vector < int > > go[maxn], in[maxn];
vector < int > open[maxn];
int h[maxn], up[maxn][logg], W[5 * maxn];
ll dp[maxn];
unordered_map < int, ll > dp_calc[maxn];
int cmp[maxn];
ll add[maxn];
ll f[(1 << K)];
ll val_one[K], val_two[K][K];
void dfs(int v) {
cmp[v] = v;
for (auto u : G[v]) {
dfs(u);
if (dp_calc[cmp[u]].size() > dp_calc[cmp[v]].size()) cmp[v] = cmp[u];
}
int N = G[v].size();
assert(N <= K);
for (int i = 0; i < N; i++) {
val_one[i] = dp[G[v][i]];
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) val_two[i][j] = 0;
}
for (auto key : in[v]) {
int ind_vertex = key[1], ind_path = key[0];
int to = G[v][ind_vertex];
val_one[ind_vertex] = max(val_one[ind_vertex], dp_calc[cmp[to]][ind_path] + add[cmp[to]] + W[ind_path]);
}
for (auto key : go[v]) {
int ind_path = key[0], ind_v1 = key[1], ind_v2 = key[2];
int u1 = G[v][ind_v1], u2 = G[v][ind_v2];
ll value = dp_calc[cmp[u1]][ind_path] + dp_calc[cmp[u2]][ind_path] + add[cmp[u1]] + add[cmp[u2]] + W[ind_path];
val_two[ind_v1][ind_v2] = max(val_two[ind_v1][ind_v2], value);
val_two[ind_v2][ind_v1] = max(val_two[ind_v2][ind_v1], value);
}
for (int mask = 0; mask < (1 << N); mask++) f[mask] = 0;
for (int mask = 0; mask < (1 << N) - 1; mask++) {
for (int i = 0; i < N; i++) {
if ((mask>>i)&1) continue;
f[mask|(1 << i)] = max(f[mask|(1 << i)], f[mask] + val_one[i]);
for (int j = i + 1; j < N; j++) {
if ((mask>>j)&1) continue;
f[mask|(1 << j)|(1 << i)] = max(f[mask|(1 << j)|(1 << i)], f[mask] + val_two[i][j]);
}
}
}
for (int i = 0; i < N; i++) {
assert(val_one[i] >= 0);
for (int j = 0; j < N; j++) assert(val_two[i][j] >= 0);
}
dp[v] = f[(1 << N) - 1];
for (int i = 0; i < N; i++) {
int msk = (((1 << N) - 1)^(1 << i));
int u = G[v][i];
add[cmp[u]] += f[msk];
}
for (auto u : G[v]) {
if (cmp[v] == cmp[u]) continue;
ll dd = add[cmp[u]] - add[cmp[v]];
for (auto elem : dp_calc[cmp[u]]) {
dp_calc[cmp[v]][elem.first] = elem.second + dd;
}
}
ll dd = add[cmp[v]];
for (auto key : open[v]) {
dp_calc[cmp[v]][key] = dp[v] - dd;
}
//if (v == 4) cout << dp_calc[cmp[v]][1] + add[cmp[v]] << endl;
}
void calc(int v, int p) {
up[v][0] = p;
h[v] = h[p] + 1;
for (int i = 1; i < logg; i++) up[v][i] = up[up[v][i - 1]][i - 1];
for (auto u : g[v]) {
if (u != p) {
calc(u, v);
G[v].push_back(u);
}
}
}
int numb(int v, int need) {
for (int j = 0; j < G[v].size(); j++) {
if (G[v][j] == need) return j;
}
assert(1 == 0);
}
int get_la(int v, int k) {
for (int i = 0; i < logg; i++) {
if ((k>>i)&1) v = up[v][i];
}
return v;
}
int get_lca(int u, int v) {
if (h[u] > h[v]) u = get_la(u, h[u] - h[v]);
else v = get_la(v, h[v] - h[u]);
if (u == v) return v;
for (int i = logg - 1; i >= 0; i--) {
if (up[v][i] != up[u][i]) v = up[v][i], u = up[u][i];
}
return up[v][0];
}
main() {
#ifdef HOME
freopen("input.txt", "r", stdin);
#endif // HOME
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, m, k, u, v, w;
cin >> n >> m >> k;
ll ans = 0;
for (int i = 1; i < n; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
calc(1, 0);
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
W[i] = w;
if (u == v) {
ans += w;
continue;
}
int lca = get_lca(u, v);
if (u != lca && v != lca) {
go[lca].push_back({i, numb(lca, get_la(u, h[u] - h[lca] - 1)), numb(lca, get_la(v, h[v] - h[lca] - 1))});
open[u].push_back(i);
open[v].push_back(i);
} else if (u == lca) {
in[lca].push_back({i, numb(lca, get_la(v, h[v] - h[lca] - 1))});
open[v].push_back(i);
} else {
in[lca].push_back({i, numb(lca, get_la(u, h[u] - h[lca] - 1))});
open[u].push_back(i);
}
}
dfs(1);
ans += dp[1];
cout << ans << '\n';
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 2ms
memory: 24604kb
input:
5 7 3 1 2 1 3 2 4 2 5 3 2 8 5 4 10 3 1 2 1 2 7 2 1 2 1 2 1 5 2 3
output:
19
result:
ok 1 number(s): "19"
Test #2:
score: 0
Accepted
time: 2693ms
memory: 252648kb
input:
100000 500000 12 2 1 3 2 4 2 5 2 6 5 7 2 8 5 9 3 10 2 11 2 12 5 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 12 25 2 26 2 27 2 28 2 29 2 30 15 31 30 32 23 33 26 34 22 35 30 36 26 37 3 38 3 39 3 40 3 41 3 42 3 43 3 44 3 45 3 46 3 47 20 48 21 49 4 50 4 51 4 52 4 53 4 54 4 55 4 56 4 57 4 5...
output:
660925834533
result:
ok 1 number(s): "660925834533"
Test #3:
score: 0
Accepted
time: 2744ms
memory: 249556kb
input:
100000 500000 12 2 1 3 2 4 1 5 4 6 2 7 5 8 2 9 7 10 8 11 3 12 11 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 22 24 8 25 2 26 2 27 2 28 2 29 2 30 2 31 2 32 2 33 26 34 27 35 23 36 13 37 3 38 3 39 3 40 3 41 3 42 3 43 3 44 3 45 3 46 3 47 14 48 8 49 4 50 4 51 4 52 4 53 4 54 4 55 4 56 4 57 4 58 4...
output:
664434138007
result:
ok 1 number(s): "664434138007"
Test #4:
score: 0
Accepted
time: 2753ms
memory: 249528kb
input:
100000 500000 12 2 1 3 1 4 2 5 3 6 4 7 2 8 7 9 2 10 6 11 4 12 8 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 13 24 23 25 2 26 2 27 2 28 2 29 2 30 2 31 2 32 2 33 26 34 31 35 33 36 33 37 3 38 3 39 3 40 3 41 3 42 3 43 3 44 3 45 3 46 3 47 34 48 16 49 4 50 4 51 4 52 4 53 4 54 4 55 4 56 4 57 4 58 ...
output:
639691495391
result:
ok 1 number(s): "639691495391"
Test #5:
score: 0
Accepted
time: 2768ms
memory: 249616kb
input:
100000 500000 12 2 1 3 1 4 2 5 1 6 5 7 4 8 2 9 1 10 4 11 8 12 7 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 14 22 14 23 21 24 20 25 2 26 2 27 2 28 2 29 2 30 2 31 2 32 2 33 2 34 23 35 31 36 7 37 3 38 3 39 3 40 3 41 3 42 3 43 3 44 3 45 3 46 3 47 3 48 29 49 4 50 4 51 4 52 4 53 4 54 4 55 4 56 4 57 4 58 3...
output:
662244733768
result:
ok 1 number(s): "662244733768"
Test #6:
score: 0
Accepted
time: 2788ms
memory: 256760kb
input:
100000 500000 12 2 1 3 1 4 1 5 1 6 3 7 1 8 4 9 3 10 7 11 2 12 5 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 14 21 12 22 11 23 9 24 20 25 2 26 2 27 2 28 2 29 2 30 2 31 2 32 2 33 2 34 2 35 14 36 30 37 3 38 3 39 3 40 3 41 3 42 3 43 3 44 3 45 3 46 24 47 38 48 35 49 4 50 4 51 4 52 4 53 4 54 4 55 4 56 4 57 4 58...
output:
669458090009
result:
ok 1 number(s): "669458090009"
Test #7:
score: 0
Accepted
time: 890ms
memory: 171568kb
input:
100000 500000 12 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45 47 46 48 47 49 48 50 49 51 50 ...
output:
488921502446
result:
ok 1 number(s): "488921502446"
Test #8:
score: 0
Accepted
time: 926ms
memory: 207928kb
input:
100000 500000 12 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 16 41 40 42 41 43 42 44 33 45 44 46 45 47 46 48 47 49 48 50 49 51 50 ...
output:
468137226275
result:
ok 1 number(s): "468137226275"
Test #9:
score: 0
Accepted
time: 898ms
memory: 202768kb
input:
100000 500000 12 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45 47 46 48 47 49 48 50 35 51 50 ...
output:
483733769728
result:
ok 1 number(s): "483733769728"
Test #10:
score: 0
Accepted
time: 863ms
memory: 176852kb
input:
100000 500000 12 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45 47 46 48 47 49 48 50 49 51 50 ...
output:
478945297872
result:
ok 1 number(s): "478945297872"
Test #11:
score: 0
Accepted
time: 837ms
memory: 165860kb
input:
100000 500000 12 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45 47 46 48 47 49 48 50 49 51 50 ...
output:
489443708266
result:
ok 1 number(s): "489443708266"
Test #12:
score: 0
Accepted
time: 719ms
memory: 212244kb
input:
10000 500000 12 2 1 3 2 4 1 5 1 6 2 7 5 8 2 9 8 10 6 11 8 12 4 13 11 14 1 15 6 16 5 17 10 18 17 19 12 20 8 21 16 22 1 23 5 24 21 25 23 26 3 27 18 28 6 29 8 30 15 31 1 32 30 33 17 34 23 35 5 36 24 37 33 38 25 39 34 40 1 41 24 42 11 43 6 44 18 45 28 46 25 47 32 48 40 49 29 50 43 51 33 52 9 53 2 54 20 ...
output:
560772428222
result:
ok 1 number(s): "560772428222"
Test #13:
score: 0
Accepted
time: 744ms
memory: 219080kb
input:
10000 500000 12 2 1 3 2 4 2 5 2 6 4 7 5 8 4 9 4 10 4 11 4 12 10 13 5 14 13 15 9 16 15 17 2 18 5 19 14 20 11 21 11 22 20 23 20 24 1 25 5 26 15 27 20 28 17 29 4 30 18 31 12 32 14 33 18 34 18 35 16 36 31 37 18 38 19 39 12 40 17 41 14 42 7 43 27 44 25 45 13 46 35 47 10 48 15 49 46 50 44 51 21 52 15 53 2...
output:
572767352204
result:
ok 1 number(s): "572767352204"
Test #14:
score: 0
Accepted
time: 652ms
memory: 207988kb
input:
10000 500000 12 2 1 3 1 4 2 5 2 6 2 7 4 8 7 9 7 10 2 11 9 12 3 13 1 14 7 15 9 16 8 17 2 18 13 19 12 20 2 21 16 22 8 23 13 24 8 25 20 26 25 27 14 28 4 29 28 30 4 31 12 32 13 33 24 34 1 35 21 36 5 37 16 38 28 39 35 40 28 41 13 42 20 43 19 44 16 45 40 46 28 47 3 48 5 49 14 50 2 51 4 52 47 53 47 54 15 5...
output:
585482767864
result:
ok 1 number(s): "585482767864"
Test #15:
score: 0
Accepted
time: 692ms
memory: 209516kb
input:
10000 500000 12 2 1 3 2 4 3 5 3 6 3 7 5 8 7 9 4 10 3 11 2 12 7 13 4 14 8 15 9 16 1 17 12 18 13 19 2 20 3 21 16 22 10 23 20 24 4 25 19 26 6 27 17 28 5 29 17 30 27 31 22 32 14 33 11 34 4 35 24 36 34 37 14 38 23 39 18 40 30 41 28 42 36 43 12 44 5 45 14 46 17 47 11 48 14 49 16 50 16 51 18 52 30 53 17 54...
output:
564574799774
result:
ok 1 number(s): "564574799774"
Test #16:
score: 0
Accepted
time: 717ms
memory: 210668kb
input:
10000 500000 12 2 1 3 1 4 2 5 2 6 4 7 6 8 5 9 8 10 7 11 7 12 5 13 1 14 5 15 11 16 9 17 3 18 4 19 10 20 8 21 2 22 11 23 18 24 10 25 8 26 16 27 22 28 11 29 20 30 12 31 4 32 19 33 27 34 6 35 1 36 24 37 18 38 30 39 32 40 10 41 9 42 15 43 34 44 27 45 34 46 7 47 34 48 39 49 32 50 13 51 11 52 38 53 17 54 5...
output:
575291114848
result:
ok 1 number(s): "575291114848"