Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using uint = unsigned int;
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- using pii = pair<int, int>;
- using pll = pair<ll, ll>;
- #define dbg(x) cerr<<#x": "<<(x)<<endl
- #define dbg_p(x) cerr<<#x": "<<(x).first<<' '<<(x).second<<endl
- #define dbg_v(x, n) {cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<endl;}
- #define all(v) v.begin(), v.end()
- #define fi first
- #define se second
- template<typename T1, typename T2>
- ostream& operator <<(ostream &out, const pair<T1, T2> &item) {
- out << '(' << item.first << ", " << item.second << ')';
- return out;
- }
- template <typename T>
- ostream& operator <<(ostream &out, const vector<T>& v) {
- for(const auto &item : v) out << item << ' ';
- return out;
- }
- #define Nmax 500005
- int n,a[Nmax];
- vector<int> v[Nmax],v2[Nmax];
- pii b[Nmax];
- int uz[Nmax];
- void dfs(int nod, int ant, int h){
- a[nod] += h;
- for (auto it : v[nod]){
- if (it == ant) continue;
- v2[nod].push_back(it);
- dfs(it, nod, h+1);
- }
- }
- int dfs2(int nod){
- uz[nod] = 1;
- int x = 0;
- for (auto it : v2[nod]){
- x += dfs2(it);
- }
- return x;
- }
- bool OK(long long x){
- for (int i=1;i<=n;i++){
- // dbg(a[i]);
- if (a[i] > x) return 0;
- b[i].first = x - a[i];
- b[i].second = i;
- uz[i] = 0;
- }
- sort(b+1,b+n+1);
- // dbg_v(b+1,n);
- int p = 0;
- for (int i=1;i<=n;i++){
- if (!uz[b[i].second]){
- // dbg(p);
- // dbg(b[i]);
- p += dfs2(b[i].second);
- if (p > b[i].first) return 0;
- p++;
- }
- }
- return 1;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin >> n;
- for (int i=1;i<=n;i++){
- cin >> a[i];
- }
- for (int i=1;i<n;i++){
- int x,y;
- cin >> x >> y;
- v[x].push_back(y);
- v[y].push_back(x);
- }
- dfs(1,-1,0);
- // OK(2);
- // return 0;
- long long p = 1, st = 0;
- for (;p<2e9;p<<=1);
- for (;p>=1;p>>=1){
- if (st + p <= 2e9 && !OK(st+p)) st+=p;
- }
- if (!OK(st)) st++;
- cout << st << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement