This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |