#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;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
28 ms |
23932 KB |
Output is correct |
2 |
Correct |
26 ms |
23936 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23936 KB |
Output is correct |
2 |
Correct |
25 ms |
23928 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
526 ms |
120976 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23936 KB |
Output is correct |
2 |
Correct |
776 ms |
237324 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
706 ms |
218576 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
699 ms |
66816 KB |
Output is correct |
2 |
Correct |
512 ms |
66952 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
631 ms |
70528 KB |
Output is correct |
2 |
Correct |
181 ms |
30044 KB |
Output is correct |
3 |
Correct |
823 ms |
241116 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
185 ms |
28280 KB |
Output is correct |
2 |
Correct |
660 ms |
68088 KB |
Output is correct |
3 |
Correct |
728 ms |
53720 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
647 ms |
66360 KB |
Output is correct |
2 |
Correct |
590 ms |
66316 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
720 ms |
67872 KB |
Output is correct |
2 |
Correct |
637 ms |
46024 KB |
Output is correct |