제출 #1331041

#제출 시각아이디문제언어결과실행 시간메모리
1331041JuanJLCat Exercise (JOI23_ho_t4)C++20
31 / 100
2095 ms20252 KiB
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define forn(i,a,b) for(int i = a; i<b; i++)
#define mset(a,v) memset(a,v,sizeof(a))
#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;
typedef long long ll;

const int MAXN = 200000+5;

#ifdef D
    #define debug(x) cout << x
#else
    #define debug(x) //nothing
#endif


ll n;
ll p[MAXN];
ll res[MAXN];
vector<ll> adj[MAXN];

ll toJ;
ll lvlToJ;

void dfs(ll nd , ll pa , ll val , ll lvl){
    for(auto i:adj[nd]) if(i!=pa){
        if(p[i]>val){
            if(toJ==-1 || p[toJ]>p[i]){
                toJ=i;
                lvlToJ=lvl+1;
            }
            continue;
        }

        dfs(i,nd,val,lvl+1);
    }
}

int main(){
    
    mset(res,0);

    cin>>n;
    forn(i,0,n) cin>>p[i];

    ll u,v;
    forn(i,0,n-1){
        cin>>u>>v; u--; v--;
        adj[u].pb(v);
        adj[v].pb(u);
    }

    vector<pair<ll,ll>> ord;
    forn(i,0,n){
        ord.pb({p[i],i});
    }
    sort(ALL(ord));

    forn(i,0,n-1){
        toJ=-1;
        lvlToJ=-1;

        ll nd = ord[i].snd;
        ll val = ord[i].fst;
        dfs(nd,-1,val,0);

        debug(i<<" "<<nd<<" "<<toJ<<" "<<lvlToJ<<'\n');
        debug(res[nd]<<'\n');
        res[toJ]=max(res[toJ], res[nd]+lvlToJ);
    }

    cout<<res[ord.back().snd]<<'\n';
    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...