제출 #1323847

#제출 시각아이디문제언어결과실행 시간메모리
1323847wangzhiyi33Cat Exercise (JOI23_ho_t4)C++20
100 / 100
157 ms58340 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair<int,int>
#define aa array<int,3>
#define fir first
#define sec second
#define pb push_back
const int maxn=2e5;
int pos[maxn+2],p[maxn+2],n;
vector<int>adj[maxn+2];

int dsu[maxn+2];
int fin(int a){
    if(dsu[a]==a)return a;
    return dsu[a]=fin(dsu[a]);
}

void merg(int a,int b){
    a=fin(a),b=fin(b);
    if(a==b)return;
    if(p[a]>p[b])swap(a,b);
    dsu[a]=b;
}


int bin[maxn+2][20];
int dep[maxn+2];
void dfs(int cur,int par){
    bin[cur][0]=par;
    dep[cur]=dep[par]+1;
    for(auto x : adj[cur]){
        if(x==par)continue;
        dfs(x,cur);
    }
}

int lca(int a,int b){
    if(dep[a]<dep[b])swap(a,b);
    int slsh=dep[a]-dep[b];

    for(int q=19;q>=0;q--){
        if((slsh>>q)&1){
            a=bin[a][q];
            slsh-=(1<<q);
        }
    }
    if(a==b)return a;
    for(int q=19;q>=0;q--){
        if(bin[a][q]!=bin[b][q]){
            a=bin[a][q],b=bin[b][q];
        }
    }
    return bin[a][0];
}

int dist(int a,int b){
    return dep[a]+dep[b]-2*dep[lca(a,b)];
}


signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int q=1;q<=n;q++){
        cin>>p[q];
        pos[p[q]]=q;
    }

    for(int q=1;q<n;q++){
        int u,v; cin>>u>>v;
        adj[u].pb(v); adj[v].pb(u);
    }
    dfs(1,0);

    for(int q=1;q<20;q++){
        for(int w=1;w<=n;w++){
            bin[w][q]=bin[bin[w][q-1]][q-1];
        }
    }
    for(int q=1;q<=n;q++)dsu[q]=q;
    int dp[n+1];

    for(int q=1;q<=n;q++){
        dp[pos[q]]=0;
        for(auto x : adj[pos[q]]){
            if(p[x]<q){
                int apa=fin(x);
                dp[pos[q]]=max(dp[apa]+dist(apa,pos[q]),dp[pos[q]]);
                merg(x,pos[q]);
            }
        }
    }
    
    cout<<dp[pos[n]]<<endl;
}
#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...