Submission #1360065

#TimeUsernameProblemLanguageResultExecution timeMemory
1360065Jawad_Akbar_JJCat Exercise (JOI23_ho_t4)C++20
100 / 100
176 ms42704 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<18;
vector<int> nei[N];
int Par[N][20], hei[N], p[N], pr[N];
vector<pair<int, pair<int, int>>> E;
long long Ans[N];

void dfs(int u, int p){
	hei[u] = hei[p] + 1;
	Par[u][0] = p;

	for (int i=0;i<18;i++)
		Par[u][i+1] = Par[Par[u][i]][i];
	
	for (int i : nei[u])
		if (i != p)
			dfs(i, u);
}

int LCA(int u, int v){
	if (hei[u] > hei[v])
		swap(u, v);

	for (int i=18;i + 1;i--){
		if (hei[u] + (1<<i) <= hei[v])
			v = Par[v][i];
	}
	for (int i=18;i + 1;i--){
		if (Par[u][i] != Par[v][i])
			u = Par[u][i], v = Par[v][i];
	}
	return hei[u] - (u != v);
}

int dst(int u, int v){
	return hei[u] + hei[v] - 2 * LCA(u, v);
}

int root(int v){
	return (pr[v] == 0 ? v : pr[v] = root(pr[v]));
}
int main(){
	int n;
	cin>>n;

	for (int i=1;i<=n;i++)
		cin>>p[i];
	
	for (int i=1;i<n;i++){
		int a, b;
		cin>>a>>b;

		if (p[a] < p[b])
			swap(a, b);

		nei[a].push_back(b);
		nei[b].push_back(a);
		E.push_back({p[a], {a, b}});
	}

	dfs(1, 0);

	sort(begin(E), end(E));
	for (auto [c, ab] : E){
		auto [a, b] = ab;

		b = root(b);
		Ans[a] = max(Ans[a], Ans[b] + dst(a, b));

		pr[b] = a;
	}
	cout<<Ans[root(1)]<<endl;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...