Submission #1155770

#TimeUsernameProblemLanguageResultExecution timeMemory
1155770alir3za_zar3Cat Exercise (JOI23_ho_t4)C++20
100 / 100
127 ms55700 KiB
// Alir3za.Zar3 -> Shiraz , Iran
#include <bits/stdc++.h>
using namespace std;
#define     int     long long

const int mxN = 2e5+7 , mxL = 20;
int n,P[mxN],dp[mxN];
vector<int> e[mxN];

struct LCA
{
    int up[mxN][mxL] , o[mxN];
    void Arise (int v=1 , int p=1)
    {
        o[v] = o[p]+1; up[v][0] = p;
        for (int bit=1; bit<mxL; bit++)
            up[v][bit] = up[up[v][bit-1]][bit-1];
        for (auto to : e[v])
            if (to != p) Arise(to , v);
    }
    int path (int u , int v)
    {
        if (o[v] < o[u]) swap(v,u);
        int len = o[v] - o[u];
        for (int bit=0; bit<mxL; bit++)
            if ((1<<bit)&len) v = up[v][bit];
        if (v == u) return len;
        for (int bit=mxL-1; bit>=0; bit--)
            if (up[v][bit] != up[u][bit])
            {
                v = up[v][bit];
                u = up[u][bit];
                len += (1<<(1+bit));
            }
        return 2+len;
    }
} lca;

struct DSU 
{
    int comp[mxN];
    void Arise ()
    {
        for (int i=1; i<=n; i++)
            comp[i]=i;
    }
    int root (int v)
    { return comp[v]==v ? v:comp[v]=root(comp[v]); }
    void Union (int v , int u)
    {
        v = root(v); u = root(u);
        dp[v] = max( dp[u]+lca.path(u,v) , dp[v] );
        comp[u] = v;
    }
} dsu;

void iN ()
{
    cin >> n;
    for (int i=1; i<=n; i++)
        cin >> P[i];
    for (int i=1; i<n; i++)
    {
        int u,v; cin >> u >> v;
        e[P[u]].push_back(P[v]);
        e[P[v]].push_back(P[u]);
    }
}

void ouT ()
{
    for (int v=1; v<=n; v++)
        for (auto to : e[ v ])
            if (to < v) dsu.Union(v , to);
    cout << dp[n] << '\n';
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);     cout.tie(0);
        
    iN ();
    lca.Arise ();
    dsu.Arise ();
    ouT ();
}
#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...