Submission #1225639

#TimeUsernameProblemLanguageResultExecution timeMemory
1225639TadijaSebezCat Exercise (JOI23_ho_t4)C++20
100 / 100
195 ms56672 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back

const int N=200050;
const int L=20;
vector<int> E[N],G[N];
int dep[N],par[N][L];

void DFS(int u,int p){
    par[u][0]=p;
    for(int i=1;i<L;i++){
        par[u][i]=par[par[u][i-1]][i-1];
    }
    dep[u]=dep[p]+1;
    for(int v:E[u]){
        if(v!=p){
            DFS(v,u);
        }
    }
}
int LCA(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    for(int i=L-1;i>=0;i--)if(dep[par[u][i]]>=dep[v])u=par[u][i];
    for(int i=L-1;i>=0;i--)if(par[u][i]!=par[v][i])u=par[u][i],v=par[v][i];
    return u==v?v:par[v][0];
}
int Dist(int u,int v){return dep[u]+dep[v]-2*dep[LCA(u,v)];}

ll dp[N],val[N];
void Solve(int u){
    for(int v:G[u]){
        Solve(v);
        dp[u]=max(dp[u],dp[v]+val[v]);
    }
}

struct DSU{
    int p[N];
    DSU(){}
    void init(int n){
        for(int i=1;i<=n;i++)p[i]=i;
    }
    int Find(int u){return p[u]==u?u:p[u]=Find(p[u]);}
    void Union(int u,int v){
        p[Find(u)]=Find(v);
    }
}DS;

int p[N],node[N];
int main(){
    int n;
    scanf("%i",&n);
    for(int i=1;i<=n;i++)scanf("%i",&p[i]),node[p[i]]=i;
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%i %i",&u,&v);
        E[u].pb(v);
        E[v].pb(u);
    }
    DFS(1,0);
    DS.init(n);
    for(int i=1;i<=n;i++){
        for(int j:E[node[i]]){
            if(p[j]<i){
                G[i].pb(DS.Find(p[j]));
                val[DS.Find(p[j])]=Dist(node[i],node[DS.Find(p[j])]);
                //printf("%i -> %i: %lld\n",i,DS.Find(p[j]),val[DS.Find(p[j])]);
                DS.Union(p[j],i);
            }
        }
    }
    Solve(n);
    printf("%lld\n",dp[n]);
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |     scanf("%i",&n);
      |     ~~~~~^~~~~~~~~
Main.cpp:55:31: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |     for(int i=1;i<=n;i++)scanf("%i",&p[i]),node[p[i]]=i;
      |                          ~~~~~^~~~~~~~~~~~
Main.cpp:58:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |         scanf("%i %i",&u,&v);
      |         ~~~~~^~~~~~~~~~~~~~~
#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...