제출 #98271

#제출 시각아이디문제언어결과실행 시간메모리
98271dalgerokMag (COCI16_mag)C++17
24 / 120
604 ms138544 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e6 + 5; int n, a[N], dp[N], ans1 = -1, ans2 = -1; vector < int > g[N]; void dfs1(int v, int pr = -1){ int mx1 = 0, mx2 = 0; for(int to : g[v]){ if(to != pr){ dfs1(to, v); if(dp[to] > mx1){ mx2 = mx1; mx1 = dp[to]; } else if(dp[to] > mx2){ mx2 = dp[to]; } } } if(a[v] == 1){ dp[v] = mx1 + 1; ans1 = max(ans1, mx1 + mx2 + 1); } } void dfs2(int v, int pr = -1){ int mx1 = 0, mx2 = 0; for(int to : g[v]){ if(to != pr){ dfs2(to, v); if(dp[to] > mx1){ mx2 = mx1; mx1 = dp[to]; } else if(dp[to] > mx2){ mx2 = dp[to]; } } } if(a[v] == 2){ dp[v] = mx1 + 1; ans2 = max(ans2, mx1 + mx2 + 1); } } 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); } ans1 = ans2 = -1; for(int i = 1; i <= n; i++){ cin >> a[i]; if(a[i] == 1){ ans1 = 1; } if(a[i] == 2){ ans2 = 1; } } memset(dp, 0, sizeof(dp)); dfs1(1); memset(dp, 0, sizeof(dp)); dfs2(1); if(ans1 != -1){ if(ans2 == -1){ cout << "1/" << ans1; } else if(ans1 * 2 > ans2){ cout << "1/" << ans1; } else{ if(ans2 & 1){ cout << "2/" << ans2; } else{ cout << "1/" << ans2 / 2; } } return 0; } int ans = 2e9; for(int i = 1; i <= n; i++){ ans = min(ans, a[i]); } cout << ans << "/1"; }
#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...