제출 #1314867

#제출 시각아이디문제언어결과실행 시간메모리
1314867WH8Cat Exercise (JOI23_ho_t4)C++20
100 / 100
346 ms65920 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pll pair<long long, long long>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double
#define sz(x) static_cast<int>((x).size())
#define i5 tuple<int,int,int,int,int>
#define all(x) x.begin(), x.end()
#define iiii tuple<int, int,int,int>

int p[200005];
int par(int x){
	if(p[x]==0)return x;
	return p[x]=par(p[x]);
}
signed main(){
	int n;cin>>n;
	vector<int> v(n+1), dep(n+1, 0);
	vector<vector<int>> al(n+1), up(n+1, vector<int>(20));
	for(int i=1;i<=n;i++)cin>>v[i];
	for(int i=0;i<n-1;i++){
		int a,b;cin>>a>>b;
		al[a].pb(b);
		al[b].pb(a);
	}
	vector<int> ord(n);
	iota(all(ord), 1);
	sort(all(ord), [&](int a, int b){return v[a] < v[b];});
	auto dfs=[&](auto && dfs, int x, int p)->void{
		for(auto it:al[x]){
			if(it==p)continue;
			dep[it]=dep[x]+1;
			up[it][0]=x;
			dfs(dfs, it, x);
		}
	};
	dfs(dfs, 1, 0);
	for(int j=1;j<20;j++) for(int i=1;i<=n;i++) up[i][j]=up[up[i][j-1]][j-1];
	auto lca=[&](int a, int b)->int{
		if(dep[a] < dep[b])swap(a, b);
		int r=dep[a]-dep[b];
		for(int i=0;i<20;i++)if((1<<i) & r) a=up[a][i];
		if(a==b)return a;
		for(int i=19;i>=0;i--) if(up[a][i] != up[b][i])a=up[a][i], b=up[b][i];
		return up[a][0];
	};
	auto dist=[&](int a, int b)->int{
		return dep[a] + dep[b] - 2*dep[lca(a,b)];
	};
	// always transition to the max in the connected component.
	vector<int> dp(n+1, 0);
	for(int i : ord){
		for(auto it:al[i]){
			if(v[it] < v[i]){
				int t=par(it);
				dp[i]=max(dp[i], dp[t]+dist(i, t));
				p[t]=i;
			}
		}
	}
	cout<<dp[ord[n-1]];
}
#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...