Submission #790845

#TimeUsernameProblemLanguageResultExecution timeMemory
790845willychanCat Exercise (JOI23_ho_t4)C++14
100 / 100
314 ms57324 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; //#include<bits/extc++.h> //__gnu_pbds const int N = 200005; int w[N]; vector<int> side[N]; vector<int> from[N]; int head[N]; int p[N][19]; int dep[N]; ll dp[N]; void dfs(int cur){ for(auto v : side[cur]){ if(v==p[cur][0]) continue; p[v][0]=cur; dep[v]=dep[cur]+1; dfs(v); } } int dis(int a,int b){ int oga= a; int ogb = b; if(dep[a]>dep[b]) swap(a,b); for(int l = 18;l>=0;l--){ if(dep[p[b][l]]>dep[a]) b = p[b][l]; } if(dep[b]!=dep[a]) b = p[b][0]; if(a==b){ return abs(dep[oga]-dep[ogb]); } for(int l=18;l>=0;l--){ if(p[b][l]!=p[a][l]){ a = p[a][l]; b = p[b][l]; } } if(a!=b) a=p[a][0]; return abs(dep[a]-dep[oga])+abs(dep[a]-dep[ogb]); } int query(int a){ if(head[a]==a) return a; head[a] = query(head[a]); return head[a]; } void join(int a,int b){ a = query(a);b = query(b); if(a==b) return; if(w[a]>w[b]) swap(a,b); head[a] =b; } int main(){ ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n;cin>>n; for(int i=1;i<=n;i++) cin>>w[i]; for(int i=0;i<n-1;i++){ int a,b;cin>>a>>b; side[a].push_back(b); side[b].push_back(a); } p[1][0]=1; dep[1]=1; dfs(1); for(int l=1;l<19;l++){ for(int i=1;i<=n;i++){ p[i][l] = p[p[i][l-1]][l-1]; } } int order[n]; for(int i=1;i<=n;i++) {order[i-1]=i;head[i]=i;} sort(order,order+n,[&](const int a,const int b){return w[a]<w[b];}); for(int i=0;i<n;i++){ int cur = order[i]; for(auto v : side[cur]){ if(w[v]>w[cur]) continue; int g = query(v); from[g].push_back(cur); join(g,cur); } } sort(order,order+n,[&](const int a,const int b){return w[a]>w[b];}); ll maxn = 0; for(int i=1;i<n;i++){ int cur = order[i]; for(auto v : from[cur]){ dp[cur] = max(dp[v]+dis(v,cur),dp[cur]); } maxn = max(dp[cur],maxn); } cout<<maxn<<"\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...