QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#129836 | #6738. Cover | UndertrainedOverpressure# | AC ✓ | 949ms | 38700kb | C++23 | 5.2kb | 2023-07-23 01:51:18 | 2023-07-23 01:51:21 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define TIME (clock() * 1.0 / CLOCKS_PER_SEC)
const int M = 1e5 + 239;
const int T = (1 << 18) + 239;
const int N = 5e5 + 239;
const int L = 18;
int n, m, k;
vector<int> v[M];
vector<int> tree[M];
int go[M][L];
int h[M];
int l[M], r[M];
vector<int> et;
int loc[M];
void dfs_dp(int p, int ls) {
l[p] = et.size();
et.emplace_back(p);
if (ls == -1) {
h[p] = 0;
for (int i = 0; i < L; i++) {
go[p][i] = p;
}
} else {
h[p] = h[ls] + 1;
go[p][0] = ls;
for (int i = 1; i < L; i++) {
go[p][i] = go[go[p][i - 1]][i - 1];
}
}
for (int i : v[p]) {
if (i != ls) {
tree[p].emplace_back(i);
dfs_dp(i, p);
}
}
r[p] = et.size();
}
int goup(int f, int cnt) {
for (int i = 0; i < L; i++) {
if ((cnt >> i) & 1) {
f = go[f][i];
}
}
return f;
}
int lca(int s, int f) {
if (h[s] > h[f]) {
swap(s, f);
}
if (h[f] != h[s]) {
int cnt = h[f] - h[s];
f = goup(f, cnt);
}
if (s == f) {
return s;
}
for (int i = L - 1; i >= 0; i--) {
if (go[s][i] != go[f][i]) {
s = go[s][i];
f = go[f][i];
}
}
return go[s][0];
}
vector<tuple<int, int, int>> paths[M];
const int MS = (1 << 12) + 10;
ll dp_mask[MS];
ll dp[M];
ll both[L][L];
int idx[M];
ll sm[T], add[T];
void push(int i, int l, int r) {
sm[i] += add[i];
if (r - l != 1) {
add[2 * i + 1] += add[i];
add[2 * i + 2] += add[i];
}
add[i] = 0;
}
void upd(int i, int l, int r, int ql, int qr, ll x) {
push(i, l, r);
if (r <= ql || qr <= l) {
return;
}
if (ql <= l && r <= qr) {
add[i] += x;
push(i, l, r);
return;
}
int mid = (l + r) / 2;
upd(2 * i + 1, l, mid, ql, qr, x);
upd(2 * i + 2, mid, r, ql, qr, x);
sm[i] = min(sm[2 * i + 1], sm[2 * i + 2]);
}
ll get(int i, int l, int r, int p) {
push(i, l, r);
if (r - l == 1) {
return sm[i];
}
int mid = (l + r) / 2;
push(2 * i + 1, l, mid);
push(2 * i + 2, mid, r);
ll ans;
if (p < mid) {
ans = get(2 * i + 1, l, mid, p);
} else {
ans = get(2 * i + 2, mid, r, p);
}
sm[i] = min(sm[2 * i + 1], sm[2 * i + 2]);
return ans;
}
ll getval(int p) {
return get(0, 0, n, l[p]);
}
void dfs(int p) {
int cnt = 0;
for (int i : tree[p]) {
idx[i] = cnt++;
dfs(i);
}
int sz = tree[p].size();
for (int i = 0; i < sz; i++) {
for (int j = 0; j < sz; j++) {
both[i][j] = -1;
}
}
for (auto [s, f, w] : paths[p]) {
if (f == p) {
swap(s, f);
}
if (s == p) {
int cur_id = idx[goup(f, h[f] - h[p] - 1)];
both[cur_id][cur_id] = max(both[cur_id][cur_id], getval(f) + w);
continue;
}
int idx1 = idx[goup(s, h[s] - h[p] - 1)];
int idx2 = idx[goup(f, h[f] - h[p] - 1)];
if (idx1 > idx2) {
swap(idx1, idx2);
swap(s, f);
}
both[idx1][idx2] = max(both[idx1][idx2], getval(s) + getval(f) + w);
}
dp_mask[0] = 0;
for (int mask = 1; mask < (1 << sz); mask++) {
int i;
for (i = 0; i < sz; i++) {
if ((mask >> i) & 1) {
break;
}
}
dp_mask[mask] = dp_mask[mask ^ (1 << i)] + dp[tree[p][i]];
if (both[i][i] != -1) {
dp_mask[mask] = max(dp_mask[mask], dp_mask[mask ^ (1 << i)] + both[i][i]);
}
for (int j = i + 1; j < sz; j++) {
if ((mask >> j) & 1) {
if (both[i][j] != -1) {
dp_mask[mask] = max(dp_mask[mask], dp_mask[mask ^ (1 << i) ^ (1 << j)] + both[i][j]);
}
}
}
}
dp[p] = dp_mask[(1 << sz) - 1];
//cerr << p + 1 << " " << sz << " " << dp[p] << "\n";
upd(0, 0, n, l[p], l[p] + 1, dp[p]);
for (int i = 0; i < sz; i++) {
int to = tree[p][i];
upd(0, 0, n, l[to], r[to], dp_mask[((1 << sz) - 1) ^ (1 << i)]);
//cerr << dp_mask[((1 << sz) - 1) ^ (1 << i)] << "|" << to + 1 << " " << l[to] << " " << r[to] << " ";
}
//cerr << "!\n";
}
void solve() {
cin >> n >> m >> k;
for (int i = 0; i < n - 1; i++) {
int s, f;
cin >> s >> f;
s--, f--;
v[s].emplace_back(f);
v[f].emplace_back(s);
}
dfs_dp(0, -1);
for (int i = 0; i < n; i++) {
loc[et[i]] = i;
}
for (int i = 0; i < m; i++) {
int s, f, w;
cin >> s >> f >> w;
s--, f--;
paths[lca(s, f)].emplace_back(s, f, w);
}
dfs(0);
cout << dp[0] << "\n";
}
int main() {
#ifdef ONPC
freopen("input", "r", stdin);
#endif
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 17436kb
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: 930ms
memory: 36716kb
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: 945ms
memory: 37188kb
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: 933ms
memory: 37704kb
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: 949ms
memory: 36468kb
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: 916ms
memory: 35896kb
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: 506ms
memory: 38484kb
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: 483ms
memory: 38328kb
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: 476ms
memory: 38700kb
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: 499ms
memory: 38436kb
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: 505ms
memory: 38500kb
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: 238ms
memory: 26032kb
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: 233ms
memory: 25460kb
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: 245ms
memory: 24668kb
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: 248ms
memory: 25932kb
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: 257ms
memory: 22620kb
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"