제출 #1158281

#제출 시각아이디문제언어결과실행 시간메모리
1158281elotelo966Cat Exercise (JOI23_ho_t4)C++20
0 / 100
3 ms584 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 5005 #define mid (start+end)/2 #define pb push_back int n,l; int dizi[lim],dp[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],dizi[up[node][i]]); } 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(!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(!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){ //cout<<node<<endl; if(~dp[node])return dp[node]; int cev=0; FOR{ if(node==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)+distance); } } return dp[node]=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,1); cout<<f(baslangic)<<'\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...