Submission #1158740

#TimeUsernameProblemLanguageResultExecution timeMemory
1158740elotelo966Cat Exercise (JOI23_ho_t4)C++20
7 / 100
108 ms164680 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 20
#define mid (start+end)/2
#define pb push_back

int n,l;

int dizi[lim],dp[lim][(1<<lim)];

vector<int> v[lim];

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

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

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 cev=dizi[node1];
	for(int i=l;i>=0;i--){
		if(up[node1][i]!=0 && (!anc(up[node1][i],node2))){
			cev=max(cev,ger[node1][i]);
			node1=up[node1][i];
		}
	}
	cev=max(cev,ger[node1][0]);
	return cev;
}

inline int f(int node,int mask){
	//cout<<node<<endl;
	if(~dp[node][mask])return dp[node][mask];
	int cev=0;
	FOR{
        if(mask&(1<<i))continue;
		int lca=find_lca(i,node);
		int distance=dist[i]+dist[node]-2*dist[lca];
		int maxi=0;
		maxi=max(maxi,con(i,lca));
		maxi=max(maxi,con(node,lca));
		//cout<<node<<" "<<i<<" "<<maxi<<" "<<dizi[node]<<" "<<distance<<endl;
		if(maxi<=dizi[node]){// check
			cev=max(cev,f(i,mask|(1<<i))+distance);
		}
	}
	return dp[node][mask]=cev;
}

int32_t main(){
	faster
	memset(dp,-1,sizeof(dp));
	cin>>n;
	l=ceil(log2(n));
	int baslangic;
	FOR{
		cin>>dizi[i];
		if(dizi[i]==n)baslangic=i;
	}
	
	FOR{
		if(i==1)continue;
		int x,y;cin>>x>>y;
		v[x].pb(y);
		v[y].pb(x);
	}
	
	dfs(1,0);
	
	cout<<f(baslangic,0)<<'\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...