Submission #1169483

#TimeUsernameProblemLanguageResultExecution timeMemory
1169483ZeroCoolCat Exercise (JOI23_ho_t4)C++20
100 / 100
298 ms71928 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define ld long double
#define all(v) v.begin(),v.end()
#define ar array

const int M = 1e6;
const int N = 26e4 + 20;
const int LOG = 31;
const int INF = 1e18;
const int MOD = 1e9 + 7;
const ld EPS = 1e-9;
inline void mm(int &x){x = (x % MOD + MOD) % MOD;}
inline void chmin(int &x, int y){x = min(x, y);}
inline void chmax(int &x, int y){x = max(x, y);}

#pragma GCC optimize("unroll-loops,O3")

int n;
int A[N];
vector<int> g[N];
int up[N][LOG];
int d[N];
void dfs(int x,int p){
    up[x][0] = p;
    for(int i = 1;i < LOG;i++)up[x][i] = up[up[x][i - 1]][i - 1];
    for(auto u: g[x]){
        if(u == p)continue;
        d[u] = d[x] + 1;
        dfs(u, x);
    }
}

int lca(int a,int b){
    if(d[a] < d[b])swap(a, b);
    int k = d[a] - d[b];
    for(int i = 0;i < LOG;i++){
        if((1 << i) & k)a = up[a][i];
    }
    if(a == b)return a;
    for(int i = LOG - 1;i >= 0;i--){
        if(up[a][i] != up[b][i]){
            a = up[a][i];
            b = up[b][i];
        }
    }
    return up[a][0];
}

int qry(int a,int b){
    int l = lca(a, b);
    return d[a] + d[b] - 2 * d[l];
}

int p[N];
int fnd(int x){
    if(p[x] == x)return x;
    return p[x] = fnd(p[x]);
}

void orz(){
    cin>>n;
    for(int i = 0;i < n;i++)cin>>A[i];
    for(int i = 1;i < n;i++){
        int a, b;
        cin>>a>>b;
        --a, --b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    dfs(0, 0);
    iota(p, p + n, 0);
    int ord[n];
    iota(ord, ord + n, 0);
    sort(ord, ord + n, [&](int a,int b)-> bool{
        return A[a] < A[b];
    });
    int dp[n] = {0};
    for(auto x: ord){
        for(auto u: g[x]){
            if(A[u] > A[x])continue;
            u = fnd(u);
            dp[x] = max(dp[x], dp[u] + qry(u, x));
            p[u] = x;
        }
    }
    cout<<dp[ord[n - 1]];
}

signed main(){ios_base::sync_with_stdio(false);cin.tie(0);
   
    int t = 1;
    //cin>>t;
    while(t--)orz();
} 
#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...