Submission #1160125

#TimeUsernameProblemLanguageResultExecution timeMemory
1160125elotelo966Cat Exercise (JOI23_ho_t4)C++20
0 / 100
2 ms5188 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define FOR for(int i=1;i<=n;i++)
#define lim 200005
#define mid (start+end)/2
#define pb push_back

int n,l,ans;

int dizi[lim],mp[lim];

vector<int> v[lim];

int timer,tin[lim],tout[lim],dist[lim];

int up[lim][35],ger[lim][35];

int par[lim],sz[lim],buy[lim],cev[lim];

inline void dfs(int node,int ata){
	tin[node]=tout[node]=++timer;
	dist[node]=dist[ata]+1;
	up[node][0]=ata;
	ger[node][0]=dizi[ata];
	for(int i=1;i<=l;i++){
		up[node][i]=up[up[node][i-1]][i-1];
		ger[node][i]=max(ger[node][i-1],ger[up[node][i-1]][i-1]);
	}
	for(auto go:v[node]){
		if(go==ata)continue;
		dfs(go,node);
		tout[node]=max(tout[node],tout[go]);
	}
}

inline bool anc(int node1,int node2){
	return tin[node1]<=tin[node2] && tout[node1]>=tout[node2];
}

inline int find_lca(int node1,int node2){
	if(anc(node1,node2))return node1;
	if(anc(node2,node1))return node2;
	for(int i=l;i>=0;i--){
		if(up[node1][i]!=0 && (!anc(up[node1][i],node2)))node1=up[node1][i];
	}
	return up[node1][0];
}

inline int con(int node1,int node2){
	if(node1==node2)return dizi[node1];
	int cevv=dizi[node1];
	for(int i=l;i>=0;i--){
		if(up[node1][i]!=0 && (!anc(up[node1][i],node2))){
			cevv=max(cevv,ger[node1][i]);
			node1=up[node1][i];
		}
	}
	cevv=max(cevv,ger[node1][0]);
	return cevv;
}

inline int find(int node){
    if(node==par[node])return node;
    return par[node]=find(par[node]);
}

inline void uni(int node1,int node2){
    node1=find(node1);
    node2=find(node2);
    if(node1==node2)return ;
   // cout<<node1<<" "<<node2<<endl;
    int lca=find_lca(buy[node1],buy[node2]);
	int distance=dist[buy[node1]]+dist[buy[node2]]-2*dist[lca];
   // if(sz[node1]<sz[node2])swap(node1,node2);
    if(dizi[buy[node1]]<dizi[buy[node2]])buy[node1]=buy[node2];
    cev[node1]=max(cev[node1],cev[node2]+distance);
    par[node2]=node1;
    sz[node1]+=sz[node2];
}

int32_t main(){
	faster
	cin>>n;
	l=ceil(log2(n));
	FOR{
		cin>>dizi[i];
		mp[dizi[i]]=i;
        par[i]=i;
        sz[i]=1;
        buy[i]=dizi[i];
	}
	
	FOR{
		if(i==1)continue;
		int x,y;cin>>x>>y;
		v[x].pb(y);
		v[y].pb(x);
	}
	
	dfs(1,0);

    FOR{
        int node=mp[i];
        for(auto go:v[node]){
            if(dizi[go]<i){
                uni(go,node);
            }
        }
    }

    //cout<<ans<<'\n';

    cout<<cev[find(n)]<<'\n';
	
	return 0;
}
#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...