// g++ -std=c++14
/*
Today might be the chance to grasp the chance to let your talent bloom.
May be tomorrow, the day after, or next year...
May be even when you are 30. I'm not sure if physique has anything to do with it
but if you think that it will never come, it probably never will.
- Tooru Oikawa.
*/
#include<bits/stdc++.h>
typedef long long ll;
typedef long double lld;
using namespace std;
#define endl "\n"
#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define MEMS(a,b) memset(a,b,sizeof(a))
#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
#define all(c) c.begin(),c.end()
#define pii pair<int, int>
#define tr(...) cout<<__FUNCTION__<<' '<<__LINE__<<" = ";trace(#__VA_ARGS__, __VA_ARGS__)
template<typename S, typename T>
ostream& operator<<(ostream& out,pair<S,T> const& p){out<<'('<<p.fi<<", "<<p.se<<')';return out;}
template<typename T>
ostream& operator<<(ostream& out,vector<T> const& v){
ll l=v.size();for(ll i=0;i<l-1;i++)out<<v[i]<<' ';if(l>0)out<<v[l-1];return out;}
template <typename T>
ostream &operator<<(ostream &out, set<T> const &v) {
for (auto i = v.begin(); i != v.end(); i++)
out << (*i) << ' ';
return out;
}
template <typename T, typename V>
ostream &operator<<(ostream &out, map<T, V> const &v) {
for (auto i = v.begin(); i != v.end(); i++)
out << "\n" << (i->first) << ":" << (i->second);
return out;
}
template<typename T>
void trace(const char* name, T&& arg1){cout<<name<<" : "<<arg1<<endl;}
template<typename T, typename... Args>
void trace(const char* names, T&& arg1, Args&&... args){
const char* comma = strchr(names + 1, ',');cout.write(names, comma-names)<<" : "<<arg1<<" | ";trace(comma+1,args...);}
#define int ll
const int N = 1e6 + 100;
int n;
vector<vector<int>> g(N);
int arr[N];
int dp_down[N], dp_up[N];
int parent[N];
int ans0 = 0;
void dfs0(int v, int p) {
parent[v] = p;
int curr = (arr[v] == 1);
vector<int> child;
for (auto u : g[v]) {
if (u == p) continue;
dfs0(u, v);
curr = max(curr, dp_down[u] + 1);
child.push_back(dp_down[u]);
}
if (arr[v] == 1) {
dp_down[v] = curr;
if (child.empty()) {
ans0 = max(ans0, 1LL);
} else if ((int)child.size() == 1) {
ans0 = max(ans0, child.back() + 1);
} else {
sort(all(child));
reverse(all(child));
ans0 = max(ans0, child[0] + child[1] + 1LL);
}
}
}
void dfs1(int v, int p, int mx_len = 0) {
// tr(v, mx_len);
dp_up[v] = mx_len;
if (arr[v] == 1) {
multiset<int> child;
child.insert(mx_len);
for (auto u : g[v]) {
if (u == p) continue;
child.insert(dp_down[u]);
}
for (auto u : g[v]) {
if (u == p) continue;
child.erase(child.find(dp_down[u]));
int heremx = *child.rbegin() + 1;
dfs1(u, v, heremx);
child.insert(dp_down[u]);
}
} else {
for (auto u : g[v]) {
if (u == p) continue;
dfs1(u, v, 0);
}
}
}
int cmp(int a, int b, int c, int d) {
return (a * d < c * b);
}
const int inf = 1e9 + 1;
int solve() {
cin >> n;
for (int i = 0; i < n - 1; i++) {
int v, u;
cin >> v >> u;
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
dfs0(1, 0);
dfs1(1, 0);
if (ans0 == 0) {
int mi = inf;
for (int i = 1; i <= n; i++) {
mi = min(mi, arr[i]);
}
cout << mi << "/1" << endl;
} else {
int a = 1, b = ans0;
for (int i = 1; i <= n; i++) {
vector<int> pth;
for (auto j : g[i]) {
if (j == parent[i]) continue;
pth.push_back(dp_down[j]);
}
pth.push_back(dp_up[i]);
sort(all(pth));
reverse(all(pth));
// tr(i, pth, a, b);
if ((int)pth.size() == 1) {
int c = arr[i], d = pth[0] + 1;
if (!cmp(a, b, c, d)) {
a = c, b = d;
}
} else {
int c = arr[i], d = 1 + pth[0] + pth[1];
if (!cmp(a, b, c, d)) {
a = c, b = d;
}
}
}
int g = __gcd(a, b);
a /= g;
b /= g;
cout << a << "/" << b << endl;
}
return 0;
}
int32_t main(){ _
int t;
// cin >> t;
t = 1;
while (t--) solve();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
23936 KB |
Output is correct |
2 |
Correct |
18 ms |
23936 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
23936 KB |
Output is correct |
2 |
Correct |
19 ms |
23936 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
719 ms |
162936 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
23936 KB |
Output is correct |
2 |
Correct |
844 ms |
262144 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
726 ms |
262148 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
740 ms |
101600 KB |
Output is correct |
2 |
Correct |
554 ms |
81272 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
636 ms |
112416 KB |
Output is correct |
2 |
Correct |
157 ms |
32248 KB |
Output is correct |
3 |
Runtime error |
719 ms |
262148 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
144 ms |
32208 KB |
Output is correct |
2 |
Correct |
737 ms |
103032 KB |
Output is correct |
3 |
Correct |
606 ms |
65912 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
650 ms |
101068 KB |
Output is correct |
2 |
Correct |
747 ms |
102744 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
741 ms |
103420 KB |
Output is correct |
2 |
Correct |
610 ms |
65912 KB |
Output is correct |