제출 #1246541

#제출 시각아이디문제언어결과실행 시간메모리
1246541nasjesCat Exercise (JOI23_ho_t4)C++20
14 / 100
1 ms584 KiB
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;
const ll dim = 1e3+7;
//const ll mod = 1e9 + 7;
const ll inf = 1e17 + 77;
#define endl "\n"
#define fi first
#define pb push_back
#define se second
#define vll vector<ll>

ll n, m;
pll h[dim];
vll a[dim];
ll dp[dim], dep[dim], tin[dim], tout[dim];
ll jump[24][dim];
vll g[dim];
ll boss[dim];
ll findboss(ll v){
    if(boss[v]==v)return v;
    return boss[v]=findboss(boss[v]);
}
ll t=0;
void dfs(ll v,ll p,  ll d){
    dep[v]=d;
    t++;
    tin[v]=t;
    jump[0][v]=p;
    for(int i=1; i<=21; i++){
        jump[i][v]=jump[i-1][jump[i-1][v]];
    }
    for( auto x:a[v]){
        if(x==p)continue;
        dfs(x, v, d+1);
    }
    t++;
    tout[v]=t;
}
ll same(ll x, ll y){
    if(tin[x]<=tin[y] && tout[y]<=tout[x])return 1;
    swap(x, y);
    if(tin[x]<=tin[y] && tout[y]<=tout[x])return 1;
    return 0;
}
ll lca(ll x, ll y){
    if(dep[x]>dep[y])swap(x, y);
    ll cur=x;
    if(same(x, y)){
        return x;
    }
    for(int st=20; st>=0; st--){
        if(!same(jump[st][cur], y)){
            cur=jump[st][cur];
        }
    }
   // cout<<cur<<endl;
    return jump[0][cur];
}
ll dst(ll x, ll y){
    ll p1=dep[lca(x, y)];
    return dep[x]+dep[y]-2*p1;

}
void unite(ll x, ll y){
    ll xx=findboss(x);
    boss[xx]=y;
}
int main() {

    ll k, u, v;
    string s;
    cin>>n;
    for(int i=1; i<=n; i++){
        cin>>h[i].fi;
        h[i].se=i;
        dp[i]=0;
        boss[i]=i;
    }
    for(int i=1; i<=n-1; i++){
        cin>>u>>v;
        a[u].pb(v);
        a[v].pb(u);
        if(h[u]<h[v])swap(u, v);
        g[u].pb(v);
    }
    sort(h+1, h+1+n);
    t=0;
    dfs(1, 1, 1);
    for(int i=1; i<=n; i++){
        ll cur=h[i].se;
      // cout<<cur<<" -- ";
        for(auto x:g[cur]){
            ll tmp=findboss(x);
            ll d=dst(cur, tmp);
            //cout<<tmp<<" "<<d<<endl;
            dp[cur]=max(dp[cur], dp[tmp]+d);
        }
       // cout<<dp[cur]<<endl;
        for(auto x:g[cur]){
            unite(x, cur);
        }
    }
    cout<<dp[h[n].se]<<endl;
    return 0;
}
#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...