File tree Expand file tree Collapse file tree 1 file changed +53
-0
lines changed
rozwiazania/xxiv/etap1/sab Expand file tree Collapse file tree 1 file changed +53
-0
lines changed Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments