답안 #1039718

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1039718 2024-07-31T08:07:06 Z DucNguyen2007 Cat Exercise (JOI23_ho_t4) C++14
0 / 100
4 ms 8284 KB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
const int maxN=2e5+5,LG=__lg(maxN)+5;
const ll inf=2e18;
int n,a[maxN+1],h[maxN+1],up[maxN+1][LG+1],root,dp[maxN+1];
vector<int> adj[maxN+1],vec;
void dfs(int u)
{
    for(auto v:adj[u])
    {
        if(v==up[u][0])
        {
            continue;
        }
        up[v][0]=u;
        h[v]=h[u]+1;
        for(int j=1;j<=LG;j++)
        {
            up[v][j]=up[up[v][j-1]][j-1];
        }
        dfs(v);
    }
}
int lca(int u,int v)
{
    if(h[u]<h[v])
    {
        swap(u,v);
    }
    for(int j=LG;j>=0;j--)
    {
        if(h[up[u][j]]>=h[v])
        {
            u=up[u][j];
        }
    }
    if(u==v)
    {
        return u;
    }
    for(int j=LG;j>=0;j--)
    {
        if(up[u][j]!=up[v][j])
        {
            u=up[u][j];
            v=up[v][j];
        }
    }
    return up[u][0];
}
struct dsu
{
    int parent[maxN+1],mx[maxN+1],pos[maxN+1];
    dsu()
    {
        memset(parent,-1,sizeof(parent));
        memset(mx,0,sizeof(mx));
        memset(pos,-1,sizeof(pos));
    }
    int Find(int v)
    {
        if(parent[v]<0)
        {
            return v;
        }
        return parent[v]=Find(parent[v]);
    }
    void Union(int a,int b)
    {
        a=Find(a);
        b=Find(b);
        if(a!=b)
        {
            if(-parent[a]<-parent[b])
            {
                swap(a,b);
            }
            parent[a]+=parent[b];
            parent[b]=a;
            if(mx[a]<mx[b])
            {
                mx[a]=mx[b];
                pos[a]=pos[b];
            }
        }
    }
}ds;
int get(int u,int v)
{
    int p=lca(u,v);
    return h[u]+h[v]-2*h[p];
}
int main()
{
    //freopen("","r",stdin);
    //freopen("","w",stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        vec.push_back(i);
        ds.mx[i]=a[i];
        ds.pos[i]=i;
        if(a[i]==n)
        {
            root=i;
        }
    }
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    h[root]=1;
    dfs(root);
    sort(vec.begin(),vec.end(),[&](int x,int y)
    {
        return a[x]<a[y];
    });
    memset(dp,0,sizeof(dp));
    for(auto u:vec)
    {
        for(auto v:adj[u])
        {
            int pos_v=ds.pos[ds.Find(v)];
            dp[u]=max(dp[u],dp[v]+get(u,pos_v));
            ds.Union(u,v);
        }
    }
    cout<<dp[n];
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 8280 KB Output is correct
2 Incorrect 4 ms 8284 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 8280 KB Output is correct
2 Incorrect 4 ms 8284 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 8280 KB Output is correct
2 Incorrect 4 ms 8284 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 8280 KB Output is correct
2 Incorrect 4 ms 8284 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 8280 KB Output is correct
2 Incorrect 4 ms 8284 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 8280 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 8280 KB Output is correct
2 Incorrect 4 ms 8284 KB Output isn't correct
3 Halted 0 ms 0 KB -