diff --git a/codeforces/928/.clangd b/codeforces/928/.clangd index c9330f1..bacf048 100644 --- a/codeforces/928/.clangd +++ b/codeforces/928/.clangd @@ -41,3 +41,4 @@ CompileFlags: -e -std=c++23 -e -std=c++23 -e -std=c++23 +-e -std=c++23 diff --git a/codeforces/928/g.cc b/codeforces/928/g.cc index 0cd64c4..384a96a 100644 --- a/codeforces/928/g.cc +++ b/codeforces/928/g.cc @@ -67,26 +67,36 @@ void solve() { tree[i].push_back(a); tree[a].push_back(i); } + string s; cin >> s; s = ' ' + s; - auto dfs = [&](auto&& self, u32 u, u32 p) -> vec { - vec dp(2); - dp[0] = (s[u] == 'P') ? 1 << 30 : 0; - dp[1] = (s[u] == 'S') ? 1 << 30 : 0; + vec> dp(n + 1, vec(2)); + + auto dfs = [&](auto&& self, u32 u, u32 p) -> void { + u32 sleepCost = (s[u] == 'P') ? MAX : 0; + u32 partyCost = (s[u] == 'S') ? MAX : 0; + for (u32 v : tree[u]) { - if (v == p) + if (v == p) { continue; - auto prev = self(self, v, u); - dp[0] += min(prev[0], prev[1] + 1); - dp[1] += min(prev[1], prev[0] + 1); + } + + self(self, v, u); + u32 bestChild = min(dp[v][0], dp[v][1]); + u32 cutCost = (bestChild == MAX) ? MAX : bestChild + 1; + + sleepCost += min(dp[v][0], cutCost); + partyCost += min(dp[v][1], cutCost); } - return dp; + + dp[u][0] = sleepCost; + dp[u][1] = partyCost; }; - auto ans = dfs(dfs, 1, 0); - cout << *min_element(all(ans)) << '\n'; + dfs(dfs, 1, 0); + cout << *min_element(all(dp[1])) << '\n'; } int main() { // {{{ diff --git a/codeforces/928/io/g.out b/codeforces/928/io/g.out index 7bba283..0ac4b5d 100644 --- a/codeforces/928/io/g.out +++ b/codeforces/928/io/g.out @@ -3,5 +3,5 @@ 2 [code]: 0 -[time]: 2.3241 ms +[time]: 2.29478 ms [debug]: false \ No newline at end of file