Submission #860693

#TimeUsernameProblemLanguageResultExecution timeMemory
860693epicci23Cat Exercise (JOI23_ho_t4)C++17
100 / 100
323 ms88556 KiB
#include "bits/stdc++.h"
using namespace std;
#define pb push_back
#define endl "\n" 
#define int long long
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()

const int N = 2e5 + 10;
const int LOG = 20;

int lift[N][LOG];
int depth[N];
int ar[N];
vector<int> v[N];
vector<array<int,2>> v2[N];

void dfs(int c,int p,int d){
  depth[c]=d;
  lift[c][0]=p;
  for(int i=1;i<LOG;i++) lift[c][i]=lift[lift[c][i-1]][i-1];

  for(int x:v[c]){
  	if(x==p) continue;
  	dfs(x,c,d+1);
  }
}

int kth_par(int a,int x){
  for(int i=0;i<LOG;i++) if(x>>i&1) a=lift[a][i];
  return a;
}

int lca(int a,int b){
  if(depth[a]<depth[b]) swap(a,b);
  a=kth_par(a,depth[a]-depth[b]);
  if(a==b) return a;
  for(int i=LOG-1;i>=0;i--){
  	if(lift[a][i]!=lift[b][i]){
  	  a=lift[a][i];
  	  b=lift[b][i];
  	}
  }
  return lift[a][0];
}

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

int par[N];
int siz[N];
int val[N];

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

void merge(int a,int b){
  a=find(par[a]),b=find(par[b]);
  if(a==b) return;
 
  if(siz[a]>siz[b]) swap(a,b);

  siz[b]+=siz[a];
  par[a]=b;
  if(ar[val[a]]>ar[val[b]]) val[b]=val[a];
}

int dp[N];

void dfs2(int c,int p){
  for(auto x:v2[c]){
  	if(x[1]==p) continue;
  	dfs2(x[1],c);
    dp[c]=max(dp[c],x[0]+dp[x[1]]);
  }
 // cout << "c: " << c << " " << dp[c] << endl;
}

void solve(){
  int n;
  cin >> n;
  for(int i=1;i<=n;i++) cin >> ar[i];
  
  int xd[n+1];
  vector<int> act(n+1,0);
  for(int i=1;i<=n;i++) xd[ar[i]]=i;

  for(int i=1;i<n;i++){
  	int a,b;
  	cin >> a >> b;
  	v[a].pb(b);
  	v[b].pb(a);
  }
  
  for(int i=1;i<=n;i++){
  	val[i]=i;
  	siz[i]=1;
  	par[i]=i;
  }

  dfs(1,0,0);
   
  for(int i=1;i<=n;i++){
    int u = xd[i];
    act[u] = 1;
    for(int x:v[u]){
      if(!act[x]) continue;
      int w = val[find(x)];
      v2[u].pb({dist(u,w),w});
      v2[w].pb({dist(u,w),u});
      // cout << "new: " << u << " " << w << " " << dist(u,w) << endl; 
    }
    for(int x:v[u]){
      if(!act[x]) continue;
      merge(x,u);
    }
  }
  

  dfs2(xd[n],0); 

  cout << dp[xd[n]] << endl;

}

int32_t main(){

  cin.tie(0); ios::sync_with_stdio(0);
  
  int t=1;//cin >> t;
  while(t--) solve();

  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...