Skip to content

Commit b6243dd

Browse files
committed
Dodano rozwiązania zadania 'Sabotaż' z XXIV OI
1 parent b760f4d commit b6243dd

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

rozwiazania/xxiv/etap1/sab/sab.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Rozwiązanie zadania 'Sabotaż' z I Etapu XXIV OI.
2+
// Autor: Paweł Putra
3+
// Złożoność czasowa: O(n).
4+
// Złożoność pamięciowa: O(n).
5+
6+
#include <iostream>
7+
#include <vector>
8+
#include <algorithm>
9+
#include <iomanip>
10+
using namespace std;
11+
constexpr int MAXN = 500'005;
12+
vector<int> g[MAXN];
13+
// dp[v] = max x, takie że całe poddrzewo v mogłoby się zbuntować.
14+
double dp[MAXN];
15+
int s[MAXN];
16+
17+
void dfs(int v) {
18+
for (auto syn : g[v]) {
19+
dfs(syn);
20+
s[v] += s[syn] + 1;
21+
}
22+
23+
// Jeśli jestem liściem to dp[v] = 0,
24+
// a jak nie, to mój syn mógł być sabotażystą.
25+
if (s[v] > 0) dp[v] = 1.0 / s[v];
26+
27+
// Mój syn byłby zwykłym buntownikiem.
28+
for (auto syn : g[v]) {
29+
dp[v] = max(dp[v], min(dp[syn], (double)(s[syn] + 1) / s[v]));
30+
}
31+
}
32+
33+
int32_t main() {
34+
ios_base::sync_with_stdio(0);
35+
int n, k;
36+
cin >> n >> k;
37+
38+
for (int i = 2; i <= n; i++) {
39+
int p;
40+
cin >> p;
41+
g[p].push_back(i);
42+
}
43+
44+
dfs(1);
45+
46+
double wynik = 0;
47+
for (int v = 1; v <= n; v++) {
48+
if (s[v] >= k)
49+
wynik = max(wynik, dp[v]);
50+
}
51+
52+
cout << fixed << setprecision(9) << wynik << "\n";
53+
}

0 commit comments

Comments
 (0)