QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#329490 | #8213. Graffiti | ckiseki# | WA | 104ms | 20368kb | C++20 | 7.8kb | 2024-02-16 19:37:35 | 2024-02-16 19:37:36 |
Judging History
answer
#include <bits/extc++.h>
#include <bits/stdc++.h>
using namespace std;
template <typename T>
using ordered_set = __gnu_pbds::tree<T, __gnu_pbds::null_type, less<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>;
#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)
#include <experimental/iterator>
void debug_(auto s, auto ...a) {
cerr << "\e[1;32m(" << s << ") = (";
int f = 0;
(..., (cerr << (f++ ? ", " : "") << a));
cerr << ")\e[0m\n";
}
void orange_(auto s, auto L, auto R) {
cerr << "\e[1;33m[ " << s << " ] = [ ";
using namespace experimental;
copy(L, R, make_ostream_joiner(cerr, ", "));
cerr << " ]\e[0m\n";
}
#else
#define safe ((void)0)
#define debug(...) safe
#define orange(...) safe
#endif
constexpr int N = 300000 + 5;
vector<int> g[N];
void solve1(int n) {
cout << n << '\n';
}
void solve2(int n) {
cout << n - 1 << '\n';
}
void solveAAA(int) {
auto dfs = [&](auto self, int u, int f) -> int64_t {
int64_t ret = 0, c = 0;
for (int v : g[u]) {
if (v == f)
continue;
ret += self(self, v, u);
c += 1;
}
if (u != f)
ret += c * 2;
ret += c * (c - 1);
return ret;
};
cout << dfs(dfs, 0, 0) << '\n';
}
void maxi(int64_t &x, int64_t y) {
x = max(x, y);
}
int64_t dp[N][3][4];
void solveAAB(int) {
auto dfs = [&](auto self, int u, int f) -> void {
for (int v : g[u]) {
if (v != f)
self(self, v, u);
}
for (int x = 0; x < 2; ++x) {
// 00000 -> 00001 -> 00011 -> ... -> 11111
int c = 0;
int64_t sm = 0;
vector<int64_t> choices;
for (int v : g[u]) {
if (v == f)
continue;
sm += dp[v][0][x];
choices.push_back(dp[v][1][x] - dp[v][0][x]);
c += 1;
}
ranges::sort(choices, greater());
for (int i = 0; i <= ssize(choices); ++i) {
if (i)
sm += choices[i - 1];
const int64_t one = i, zero = c - one;
if (x == 0) {
maxi(dp[u][0][0], sm + one * zero + one);
maxi(dp[u][0][1], sm + one * zero + zero);
maxi(dp[u][0][2], sm + one * zero);
} else {
maxi(dp[u][1][0], sm);
maxi(dp[u][1][1], sm);
maxi(dp[u][1][2], sm);
}
}
}
};
dfs(dfs, 0, 0);
cout << max({dp[0][0][2], dp[0][1][2]}) << '\n';
}
void solveABA(int) {
auto dfs = [&](auto self, int u, int f) -> void {
for (int v : g[u]) {
if (v != f)
self(self, v, u);
}
for (int x = 0; x < 2; ++x) {
// 00000 -> 00001 -> 00011 -> ... -> 11111
int c = 0;
int64_t sm = 0;
vector<int64_t> choices;
for (int v : g[u]) {
if (v == f)
continue;
sm += dp[v][0][x];
choices.push_back(dp[v][1][x] - dp[v][0][x]);
c += 1;
}
ranges::sort(choices, greater());
for (int i = 0; i <= ssize(choices); ++i) {
if (i)
sm += choices[i - 1];
const int64_t one = i, zero = c - one;
if (x == 0) {
maxi(dp[u][0][0], sm);
maxi(dp[u][0][1], sm);
maxi(dp[u][0][2], sm);
} else {
maxi(dp[u][1][0], sm + zero * (zero - 1) + zero * 2);
maxi(dp[u][1][1], sm + zero * (zero - 1));
maxi(dp[u][1][2], sm + zero * (zero - 1));
}
}
}
};
dfs(dfs, 0, 0);
cout << max({dp[0][0][2], dp[0][1][2]}) << '\n';
}
void solveABC(int) {
auto dfs = [&](auto self, int u, int f) -> void {
for (int v : g[u]) {
if (v != f)
self(self, v, u);
}
for (int x = 0; x < 3; ++x) {
if (x != 1) {
int64_t sm = 0;
for (int v : g[u]) {
if (v == f)
continue;
sm += max({dp[v][0][x], dp[v][1][x], dp[v][2][x]});
}
dp[u][x][0] = dp[u][x][1] = dp[u][x][2] = dp[u][x][3] = sm;
} else {
int c0 = 0;
for (int y : {0, 2, 0}) {
int64_t sm = 0;
vector<array<int64_t, 3>> val;
for (int v : g[u]) {
if (v == f)
continue;
sm += dp[v][2 - y][x];
val.push_back({dp[v][1][x] - dp[v][y][x], dp[v][1][x] - dp[v][2 - y][x], dp[v][y][x] - dp[v][2 - y][x]});
}
ranges::sort(val, greater());
ordered_set<pair<int64_t, int>> pickA, pickB;
for (int i = 0; i < ssize(val); ++i)
pickA.insert({val[i][2], i});
auto Get = [](auto &s, int p) -> pair<int64_t, int> {
if (p == 0) {
return {numeric_limits<int64_t>::max(), 87};
} else {
return *s.find_by_order(s.size() - p);
}
};
int p1 = 0, p2 = 0;
int64_t tot = 0;
auto adjust = [&](int need, int k) {
while (p1 < int(pickA.size())) {
if (Get(pickA, p1 + 1).first + k > Get(pickB, p2).first) {
tot += Get(pickA, p1 + 1).first;
tot -= Get(pickB, p2).first;
p1 += 1;
p2 -= 1;
} else {
break;
}
}
while (p2 < int(pickB.size())) {
if (Get(pickB, p2 + 1).first > Get(pickA, p1).first + k) {
tot += Get(pickB, p2 + 1).first;
tot -= Get(pickA, p1).first;
p2 += 1;
p1 -= 1;
} else {
break;
}
}
while (p1 + p2 < need) {
if (p1 == int(pickA.size())) {
tot += Get(pickB, p2 + 1).first;
p2 += 1;
} else if (p2 == int(pickB.size())) {
tot += Get(pickA, p1 + 1).first;
p1 += 1;
} else if (Get(pickA, p1 + 1).first + k > Get(pickB, p2 + 1).first) {
tot += Get(pickA, p1 + 1).first;
p1 += 1;
} else {
tot += Get(pickB, p2 + 1).first;
p2 += 1;
}
}
while (p1 + p2 > need) {
if (Get(pickA, p1).first + k < Get(pickB, p2).first) {
tot -= Get(pickA, p1).first;
p1 -= 1;
} else {
tot -= Get(pickB, p2).first;
p2 -= 1;
}
}
};
size_t p = 0;
for (int c = int(val.size()); c >= 0; --c) {
while (p < val.size() and val[p][0] >= c) {
pair<int64_t, int> a_key = {val[p][2], p};
pair<int64_t, int> b_key = {val[p][1], p};
if (a_key >= Get(pickA, p1)) {
tot -= a_key.first;
p1 -= 1;
}
if (b_key >= Get(pickB, p2)) {
tot += b_key.first;
p2 += 1;
}
pickA.erase(a_key);
pickB.insert(b_key);
p += 1;
}
adjust(int(val.size()) - c, c);
int64_t cur = sm + tot + p1 * int64_t(c);
if (c0 == 0) {
maxi(dp[u][x][1], cur + c * c0);
maxi(dp[u][x][3], cur + c * c0);
} else {
maxi(dp[u][x][y], cur + c * c0);
}
}
c0 += y == 0;
}
}
}
};
dfs(dfs, 0, 0);
cout << max({dp[0][0][3], dp[0][1][3], dp[0][2][3]}) << '\n';
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
cin >> n;
string s;
cin >> s;
for (int i = 1; i < n; ++i) {
int u, v;
cin >> u >> v;
--u, --v;
g[u].push_back(v);
g[v].push_back(u);
}
if (s.size() == 1) solve1(n);
else if (s.size() == 2) solve2(n);
else if (s[0] == s[1] and s[1] == s[2]) {
solveAAA(n);
} else if (s[0] == s[1] or s[1] == s[2]) {
solveAAB(n);
} else if (s[0] == s[2]) {
solveABA(n);
} else {
solveABC(n);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3528kb
input:
1 a
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3788kb
input:
3 orz 1 2 2 3
output:
1
result:
ok 1 number(s): "1"
Test #3:
score: 0
Accepted
time: 1ms
memory: 3580kb
input:
2 ab 1 2
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 1ms
memory: 3580kb
input:
5 bob 3 2 5 1 1 4 2 4
output:
4
result:
ok 1 number(s): "4"
Test #5:
score: 0
Accepted
time: 1ms
memory: 3644kb
input:
50 abc 23 14 24 25 1 3 47 46 2 26 22 41 34 19 7 14 50 24 29 38 17 25 4 26 35 37 21 14 11 4 13 27 8 25 5 10 20 27 44 27 15 39 19 9 30 12 38 27 39 27 41 40 14 48 32 7 16 37 3 13 42 5 48 27 49 25 6 5 26 9 31 17 36 7 43 29 9 5 45 9 18 9 40 42 27 5 25 42 46 10 37 42 12 48 28 26 33 5
output:
37
result:
ok 1 number(s): "37"
Test #6:
score: 0
Accepted
time: 0ms
memory: 3672kb
input:
50 abc 14 26 46 47 10 13 30 19 33 46 32 50 39 6 35 13 8 5 28 3 2 21 17 22 22 6 5 20 19 3 38 3 16 2 18 34 13 6 47 6 9 28 1 2 37 47 50 10 12 34 40 19 42 19 26 46 43 3 44 47 31 47 49 18 45 34 27 13 7 34 6 34 3 45 11 44 21 13 29 24 15 40 48 39 24 6 41 47 23 27 36 21 25 21 4 20 20 44
output:
37
result:
ok 1 number(s): "37"
Test #7:
score: 0
Accepted
time: 1ms
memory: 3592kb
input:
50 abc 11 3 14 46 37 47 18 33 12 46 40 41 23 17 49 48 27 26 13 5 26 41 43 16 25 47 46 9 39 13 38 4 36 18 28 40 50 26 10 38 9 50 15 6 24 16 19 16 48 26 6 50 31 16 29 16 7 26 35 14 17 46 21 5 22 38 2 15 4 17 30 34 16 41 45 17 47 50 44 16 33 26 32 34 1 25 3 46 20 16 5 32 42 14 8 48 41 34
output:
44
result:
ok 1 number(s): "44"
Test #8:
score: 0
Accepted
time: 1ms
memory: 3584kb
input:
50 abc 9 7 43 49 26 3 14 11 17 43 23 35 19 25 44 25 2 1 10 28 4 46 21 22 15 43 39 25 16 38 38 23 34 29 47 49 46 35 5 39 25 35 32 23 27 37 3 32 37 24 20 13 33 25 1 29 30 11 31 34 18 31 50 37 13 48 22 23 8 10 41 24 42 46 36 37 48 43 49 31 40 41 12 35 24 34 45 7 35 31 7 31 11 44 28 1 6 19
output:
34
result:
ok 1 number(s): "34"
Test #9:
score: 0
Accepted
time: 1ms
memory: 3652kb
input:
50 abc 31 6 36 20 32 42 47 14 24 21 27 39 14 22 26 47 44 45 30 28 15 18 1 14 42 38 20 35 17 25 4 18 25 47 40 3 28 7 48 33 2 41 10 33 22 38 41 38 9 40 35 41 16 45 49 32 19 28 21 32 34 29 46 25 13 14 23 15 3 38 18 12 45 35 29 20 43 18 6 3 8 12 12 41 50 12 7 42 5 36 33 36 39 16 11 16 37 41
output:
30
result:
ok 1 number(s): "30"
Test #10:
score: 0
Accepted
time: 0ms
memory: 3808kb
input:
50 abc 50 18 10 32 38 18 47 13 31 6 49 18 45 47 42 4 7 18 18 27 36 13 12 13 41 12 35 8 6 40 16 8 4 22 14 44 25 2 28 18 3 27 34 32 5 27 43 5 33 11 23 24 2 18 21 39 46 5 8 49 32 19 20 28 22 12 11 5 15 38 44 7 9 5 19 49 1 16 30 50 48 25 40 11 24 27 26 5 37 50 17 24 13 5 39 26 29 27
output:
38
result:
ok 1 number(s): "38"
Test #11:
score: 0
Accepted
time: 1ms
memory: 3532kb
input:
51 abb 7 35 1 48 32 42 45 15 13 39 14 43 9 2 34 37 23 24 47 36 36 35 41 22 50 49 49 44 28 42 48 43 20 37 22 21 10 38 6 35 29 17 35 24 19 51 21 44 38 4 11 17 33 42 37 50 44 38 12 17 43 38 3 49 8 12 16 49 5 15 40 31 24 4 15 50 39 44 42 35 27 21 51 50 18 13 30 4 26 29 31 22 46 49 17 38 25 49 2 26
output:
54
result:
ok 1 number(s): "54"
Test #12:
score: 0
Accepted
time: 1ms
memory: 3660kb
input:
51 abb 4 33 29 28 44 34 31 46 46 17 27 48 25 35 45 19 36 40 35 51 22 36 43 9 26 47 21 36 12 17 51 50 13 44 3 34 19 36 15 32 47 28 1 3 2 40 33 46 5 30 48 39 41 15 8 20 14 46 34 27 40 17 24 2 38 10 9 17 30 19 32 17 16 21 23 9 42 34 6 15 10 31 11 28 18 34 49 40 37 34 50 19 28 17 39 40 20 19 7 24
output:
57
result:
ok 1 number(s): "57"
Test #13:
score: 0
Accepted
time: 1ms
memory: 3580kb
input:
51 abb 27 37 40 37 33 22 3 29 9 28 14 28 38 17 49 47 36 29 46 10 6 11 11 47 37 18 20 22 39 28 29 28 1 7 32 42 24 30 2 45 16 7 45 29 42 39 43 42 5 37 22 49 34 31 4 29 30 22 41 29 18 22 50 22 25 28 7 42 26 30 51 14 19 13 8 49 35 22 48 14 12 42 21 35 23 50 44 42 31 22 13 39 17 37 10 31 15 37 28 49
output:
70
result:
ok 1 number(s): "70"
Test #14:
score: 0
Accepted
time: 0ms
memory: 3600kb
input:
51 abb 7 43 11 39 8 5 47 44 25 49 9 30 40 3 36 17 13 41 16 50 44 10 12 7 33 44 5 2 35 7 22 45 19 43 18 32 42 19 31 10 45 29 3 19 46 48 39 2 34 25 14 43 2 19 21 7 32 16 51 27 6 24 43 41 27 32 48 15 23 43 17 16 50 43 24 28 1 13 38 19 37 19 49 2 26 10 28 43 30 19 4 22 20 42 15 19 29 44 10 19
output:
63
result:
ok 1 number(s): "63"
Test #15:
score: 0
Accepted
time: 1ms
memory: 3644kb
input:
51 aba 44 6 9 7 1 50 24 38 26 11 30 2 6 21 34 43 49 11 13 4 42 21 5 38 22 3 18 3 45 34 28 26 38 43 27 21 37 27 16 42 2 23 43 21 32 21 29 28 19 13 51 13 15 40 20 1 36 46 10 3 12 11 25 21 47 6 33 7 39 22 4 38 8 27 35 38 48 50 41 31 50 21 31 26 23 26 17 24 40 21 46 44 7 32 3 8 11 43 14 11
output:
132
result:
ok 1 number(s): "132"
Test #16:
score: 0
Accepted
time: 1ms
memory: 3656kb
input:
52 aba 19 7 11 48 4 6 5 27 46 50 6 37 50 23 12 40 37 23 13 23 32 38 22 44 52 5 34 50 26 38 35 10 51 20 7 26 41 6 15 26 39 10 10 40 3 50 33 29 30 14 45 50 14 27 21 27 42 29 49 44 31 27 18 5 36 42 16 11 29 28 24 12 8 50 38 5 43 10 48 52 1 52 47 26 40 32 2 3 44 27 28 38 20 26 23 5 17 27 9 43 25 46
output:
116
result:
ok 1 number(s): "116"
Test #17:
score: 0
Accepted
time: 1ms
memory: 3632kb
input:
52 aba 10 43 2 40 24 9 47 35 42 44 1 18 7 18 3 40 28 4 52 25 6 13 33 18 35 19 49 2 16 39 26 3 32 8 4 44 50 22 11 30 41 6 19 39 18 39 14 36 34 44 36 4 17 34 45 21 12 17 25 36 51 39 29 8 30 23 9 8 46 11 37 2 23 13 20 13 44 51 15 37 43 27 40 51 31 3 5 10 22 18 8 44 21 23 27 30 38 28 13 39 48 25
output:
88
result:
ok 1 number(s): "88"
Test #18:
score: 0
Accepted
time: 1ms
memory: 3848kb
input:
52 aba 48 38 40 22 49 23 37 3 6 12 43 42 26 22 30 39 8 7 25 7 47 41 44 11 52 1 13 1 41 14 19 41 23 39 35 13 32 19 38 13 39 41 2 27 51 21 31 19 21 9 29 36 9 39 16 27 15 22 24 42 18 30 42 9 36 30 4 7 27 9 17 5 22 9 50 30 20 16 46 52 28 21 5 16 3 1 33 22 7 28 10 21 12 34 34 39 11 39 1 11 45 11
output:
112
result:
ok 1 number(s): "112"
Test #19:
score: 0
Accepted
time: 1ms
memory: 3624kb
input:
52 aba 46 45 42 45 18 27 3 44 16 25 39 24 40 10 33 32 19 31 13 1 27 45 25 9 23 2 29 14 24 8 21 52 14 37 17 24 15 9 41 24 43 31 38 7 4 52 45 7 50 1 6 40 49 22 37 52 11 23 48 7 5 2 10 1 2 48 8 7 36 22 26 28 44 23 34 13 9 7 31 26 12 8 52 48 47 3 30 40 20 25 7 22 1 26 28 52 51 26 32 45 35 30
output:
106
result:
ok 1 number(s): "106"
Test #20:
score: 0
Accepted
time: 2ms
memory: 3844kb
input:
52 aba 36 34 23 29 28 11 2 47 33 26 16 37 27 46 52 3 8 14 44 15 51 47 37 7 34 29 50 27 12 47 6 18 20 21 17 14 18 13 10 3 49 17 13 3 42 22 30 13 46 43 5 19 9 18 11 14 38 51 21 46 40 50 39 19 48 22 43 19 24 19 19 14 22 41 45 37 15 41 26 11 31 46 4 43 35 15 3 19 41 43 32 11 29 47 1 7 47 43 7 14 25 28
output:
104
result:
ok 1 number(s): "104"
Test #21:
score: 0
Accepted
time: 104ms
memory: 20368kb
input:
300000 z 180011 260532 271217 191245 41791 255746 290587 278534 218547 277068 139010 241751 243632 263417 248223 222193 89717 215179 251082 231639 117314 8572 245286 297248 168750 266280 80957 255206 73540 12700 170796 282744 214088 139101 299056 232065 3541 39425 245901 203384 4354 21447 106700 295...
output:
300000
result:
ok 1 number(s): "300000"
Test #22:
score: -100
Wrong Answer
time: 103ms
memory: 20244kb
input:
300000 aa 145612 276393 88541 108216 226040 100484 260244 139556 150893 213849 85295 33531 270499 248769 5250 51884 24539 76804 254304 165858 85779 118908 183955 155461 5230 80950 80213 95224 58182 122060 46066 288552 138127 46553 186220 182641 21451 14106 193341 35522 269820 212259 208311 40745 229...
output:
299999
result:
wrong answer 1st numbers differ - expected: '599998', found: '299999'