Submission #1095375

#TimeUsernameProblemLanguageResultExecution timeMemory
1095375abcvuitunggioCat Exercise (JOI23_ho_t4)C++17
31 / 100
2096 ms65084 KiB
#include <bits/stdc++.h>
using namespace std;
int n,h[200001],p[200001][20],d[200001],u,v,mx,r;
set <int> ke[200001];
void dfs(int u, int par){
    for (int v:ke[u])
        if (v!=par){
            p[v][0]=u;
            for (int i=1;i<20;i++)
                p[v][i]=p[p[v][i-1]][i-1];
            d[v]=d[u]+1;
            dfs(v,u);
        }
}
int lca(int u, int v){
    if (d[u]<d[v])
        swap(u,v);
    for (int i=19;i>=0;i--)
        if (d[p[u][i]]>=d[v])
            u=p[u][i];
    if (u==v)
        return u;
    for (int i=19;i>=0;i--)
        if (p[u][i]!=p[v][i]){
            u=p[u][i];
            v=p[v][i];
        }
    return p[u][0];
}
int dist(int u, int v){
    return d[u]+d[v]-d[lca(u,v)]*2;
}
int dfs3(int u, int par){
    int res=u;
    for (int v:ke[u])
        if (v!=par){
            int w=dfs3(v,u);
            res=(h[res]>h[w]?res:w);
        }
    return res;
}
void dfs2(int u, int val){
    mx=max(mx,val);
    for (int v:ke[u]){
        ke[v].erase(u);
        int w=dfs3(v,v);
        dfs2(w,val+dist(u,w));
    }
}
int main(){
    ios_base::sync_with_stdio(NULL);cin.tie(nullptr);
    cin >> n;
    for (int i=1;i<=n;i++){
        cin >> h[i];
        if (h[i]==n)
            r=i;
    }
    for (int i=1;i<n;i++){
        cin >> u >> v;
        ke[u].insert(v);
        ke[v].insert(u);
    }
    dfs(r,r);
    dfs2(r,0);
    cout << mx;
}
#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...