Submission #98344

#TimeUsernameProblemLanguageResultExecution timeMemory
98344dalgerokMag (COCI16_mag)C++17
120 / 120
823 ms241116 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e6 + 5; int n, a[N], dp_down[N], dp_up[N]; int ans1 = -1, ans2 = -1; vector < int > g[N]; inline void upd(int &x, int y){ if(x < y){ x = y; } } inline void check(int x, int y){ /// x / y < ans1 / ans2; /// x * ans2 < ans1 * y; if(ans1 == -1){ ans1 = x; ans2 = y; } else if(1LL * x * ans2 < 1LL * ans1 * y){ ans1 = x; ans2 = y; } } void dfs1(int v, int pr = -1){ for(int to : g[v]){ if(to != pr){ dfs1(to, v); upd(dp_down[v], (a[to] == 1 ? dp_down[to] + 1 : 0)); } } } void dfs2(int v, int pr = -1){ if(pr != -1){ g[v].erase(find(g[v].begin(), g[v].end(), pr)); } int sz = (int)g[v].size(); vector < int > pref(sz + 2), suf(sz + 2); for(int i = 1; i <= sz; i++){ int to = g[v][i - 1]; pref[i] = max(pref[i - 1], (a[to] == 1 ? dp_down[to] + 1 : 0)); } for(int i = sz; i >= 1; i--){ int to = g[v][i - 1]; suf[i] = max(suf[i + 1], (a[to] == 1 ? dp_down[to] + 1 : 0)); } int mx = dp_up[v]; for(int i = 1; i <= sz; i++){ int to = g[v][i - 1]; if(a[v] == 1){ dp_up[to] = max({pref[i - 1], suf[i + 1], dp_up[v]}) + 1; } else{ dp_up[to] = 0; } int val = (a[to] == 1 ? dp_down[to] + 1 : 0); int x = a[v], y = 1 + mx + val; check(x, y); mx = max(mx, val); dfs2(to, v); } } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n; for(int i = 1; i < n; i++){ int x, y; cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } for(int i = 1; i <= n; i++){ cin >> a[i]; } dfs1(1); dfs2(1); int g = __gcd(ans1, ans2); cout << ans1 / g << "/" << ans2 / g; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...