QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#128989 | #6738. Cover | ckiseki# | AC ✓ | 1980ms | 293828kb | C++20 | 5.5kb | 2023-07-21 18:05:58 | 2023-07-21 18:06:01 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define all(x) begin(x), end(x)
#ifdef CKISEKI
#define safe cerr << __PRETTY_FUNCTION__ << " line " << __LINE__ << " safe\n"
#define debug(a...) debug_(#a, a)
#define orange(a...) orange_(#a, a)
template <typename ...T>
void debug_(const char *s, T ...a) {
cerr << "\e[1;32m(" << s << ") = (";
int cnt = sizeof...(T);
(..., (cerr << a << (--cnt ? ", " : ")\e[0m\n")));
}
template <typename I>
void orange_(const char *s, I L, I R) {
cerr << "\e[1;32m[ " << s << " ] = [";
while (L != R) cerr << " " << *L++;
cerr << " ]\e[0m\n";
}
#else
#define safe ((void)0)
#define debug(...) safe
#define orange(...) safe
#endif
namespace {
constexpr int lowbit(int x) { return x & (-x); }
class BIT {
int n;
vector<int64_t> a;
int64_t query(int p) {
int64_t r = 0;
while (p) {
r += a[p];
p -= lowbit(p);
}
return r;
}
public:
void init(int n_) {
a.assign(n = n_, 0);
}
void add(int p, int64_t v) {
while (p < n) {
a[p] += v;
p += lowbit(p);
}
}
int64_t query(int l, int r) {
return query(r) - query(l);
}
} bit;
constexpr int kN = 100000 + 5;
constexpr int kLog = 20;
vector<int> g[kN];
int tin[kN], tout[kN], tc;
int pa[kN][kLog];
int chain[kN], chains;
int head[kN];
void dfs(int u, int f) {
pa[u][0] = f;
for (int i = 1; i < kLog; ++i)
pa[u][i] = pa[pa[u][i - 1]][i - 1];
tin[u] = tc++;
for (int v : g[u]) {
if (v == f)
continue;
dfs(v, u);
if (lowbit(chain[u]) < lowbit(chain[v]))
chain[u] = chain[v];
}
if (chain[u] == 0)
chain[u] = ++chains;
tout[u] = tc;
head[chain[u]] = u;
}
bool anc(int u, int v) {
return tin[u] <= tin[v] and tout[v] <= tout[u];
}
int lca(int u, int v) {
if (anc(u, v)) return u;
for (int i = kLog - 1; i >= 0; --i) {
if (not anc(pa[u][i], v))
u = pa[u][i];
}
return pa[u][0];
}
vector<tuple<int, int, int64_t>> path[kN];
size_t pos[kN];
int64_t dp[kN][13];
uint32_t tomask(int x, int y) {
uint32_t r = 0;
if (x != -1)
r |= 1u << x;
if (y != -1)
r |= 1u << y;
return r;
}
int64_t calc(int u, int p) {
// cout << "> calc " << u << " " << p << '\n';
int64_t ret = dp[u][12];
while (chain[u] != chain[p]) {
int f = head[chain[u]];
ret += bit.query(tin[f], tin[u]);
// cout << "ret += query" << tin[f] << ' ' << tin[u] << '\n';
// cout << "ret = " << ret << "\n";
ret += dp[pa[f][0]][pos[f]];
//cout << "!ret = " << ret << '\n';
u = pa[f][0];
}
// cout << "ret += query" << tin[p] << ' ' << tin[u] << '\n';
ret += bit.query(tin[p], tin[u]);
// cout << "ret = " << ret << "\n";
return ret;
}
void solve(int u) {
tin[u] = tc++;
for (size_t i = 0; i < g[u].size(); ++i) {
pos[g[u][i]] = i;
solve(g[u][i]);
}
auto oid = [u](int x) {
int r = -1;
for (int i = 0; i < int(g[u].size()); ++i)
if (anc(g[u][i], x))
r = i;
return r;
};
for (auto &[x, y, w] : path[u]) {
w += calc(x, u);
w += calc(y, u);
//cout << x + 1 << ' ' << y + 1 << ": " << w << '\n';
x = oid(x);
y = oid(y);
}
array<int64_t, 1 << 12> val = {};
if (not g[u].empty()) {
const size_t k = g[u].size();
const size_t k2 = 1u << k;
for (size_t S = 0; S < k2; ++S) {
for (size_t i = 0; i < k; ++i) {
if ((S >> i) & 1)
val[S] += dp[g[u][i]][12];
}
}
for (auto [x, y, w] : path[u]) {
auto mask = tomask(x, y);
for (size_t S = 0; S < k2; ++S) {
if ((S & mask) == 0)
val[S | mask] = max(val[S | mask], val[S] + w);
}
}
for (size_t S = 0; S < k2; ++S) {
for (size_t i = 0; i < k; ++i) {
if ((S >> i) & 1)
continue;
dp[u][i] = max(dp[u][i], val[S]);
}
}
dp[u][12] = *max_element(val.begin(), val.end());
bit.add(tin[u] + 1, dp[u][0]);
}
tout[u] = tc;
// for (size_t i = 0; i < g[u].size(); ++i)
// cout << "dp[" << u + 1 << "][" << i << "] = " << dp[u][i] << '\n';
// cout << "dp[" << u + 1 << "][12] = " << dp[u][12] << '\n';
}
} // namespace
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i < n; ++i) {
int u, v;
cin >> u >> v;
u -= 1, v -= 1;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(0, 0);
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
u -= 1, v -= 1;
path[lca(u, v)].emplace_back(u, v, w);
}
for (int i = 0; i < n; ++i) {
int fi = -1;
vector<int> cur;
for (int j : g[i]) {
if (j != pa[i][0]) {
if (chain[j] == chain[i])
fi = j;
else
cur.push_back(j);
}
}
if (fi != -1) {
cur.push_back(fi);
reverse(cur.begin(), cur.end());
}
g[i] = cur;
// for (int j : g[i])
// cout << i << ' ' << j << '\n';
}
tc = 0;
bit.init(n + 1);
solve(0);
int64_t ans = 0;
for (auto r : dp[0])
ans = max(ans, r);
cout << ans << '\n';
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 13152kb
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: 1848ms
memory: 42948kb
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: 1929ms
memory: 41800kb
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: 1907ms
memory: 42080kb
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: 1930ms
memory: 40708kb
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: 1980ms
memory: 39628kb
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: 747ms
memory: 226560kb
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: 672ms
memory: 106676kb
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: 664ms
memory: 82188kb
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: 735ms
memory: 227692kb
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: 727ms
memory: 293828kb
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: 854ms
memory: 24716kb
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: 295ms
memory: 26436kb
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: 456ms
memory: 27100kb
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: 335ms
memory: 24124kb
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: 356ms
memory: 25476kb
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"