Submission #1039785

#TimeUsernameProblemLanguageResultExecution timeMemory
1039785vjudge1Cat Exercise (JOI23_ho_t4)C++17
100 / 100
235 ms48080 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define pii pair<int,int> #define pll pair<ll,ll> #define fi first #define se second const int maxN=2e5+5,LG=__lg(maxN)+5; const ll inf=2e18; int n,a[maxN+1],h[maxN+1],up[maxN+1][LG+1],root; ll dp[maxN+1]; vector<int> adj[maxN+1],vec; void dfs(int u) { for(auto v:adj[u]) { if(v==up[u][0]) { continue; } up[v][0]=u; h[v]=h[u]+1; for(int j=1;j<=LG;j++) { up[v][j]=up[up[v][j-1]][j-1]; } dfs(v); } } int lca(int u,int v) { if(h[u]<h[v]) { swap(u,v); } for(int j=LG;j>=0;j--) { if(h[up[u][j]]>=h[v]) { u=up[u][j]; } } if(u==v) { return u; } for(int j=LG;j>=0;j--) { if(up[u][j]!=up[v][j]) { u=up[u][j]; v=up[v][j]; } } return up[u][0]; } struct dsu { int parent[maxN+1],mx[maxN+1],pos[maxN+1]; dsu() { memset(parent,-1,sizeof(parent)); memset(mx,0,sizeof(mx)); memset(pos,-1,sizeof(pos)); } int Find(int v) { if(parent[v]<0) { return v; } return parent[v]=Find(parent[v]); } void Union(int a,int b) { a=Find(a); b=Find(b); if(a!=b) { if(-parent[a]<-parent[b]) { swap(a,b); } parent[a]+=parent[b]; parent[b]=a; if(mx[a]<mx[b]) { mx[a]=mx[b]; pos[a]=pos[b]; } } } }ds; int get(int u,int v) { int p=lca(u,v); return h[u]+h[v]-2*h[p]; } int main() { //freopen("","r",stdin); //freopen("","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; vec.push_back(i); ds.mx[i]=a[i]; ds.pos[i]=i; if(a[i]==n) { root=i; } } for(int i=1;i<n;i++) { int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } h[root]=1; dfs(root); sort(vec.begin(),vec.end(),[&](int x,int y) { return a[x]<a[y]; }); memset(dp,0,sizeof(dp)); for(auto u:vec) { //cout<<u<<'\n'; for(auto v:adj[u]) { int pos_v=ds.pos[ds.Find(v)]; if(a[pos_v]>a[u]) { continue; } dp[u]=max(dp[u],dp[pos_v]+get(u,pos_v)); //cout<<v<<" "<<pos_v<<" "<<dp[u]<<'\n'; ds.Union(u,v); } } cout<<dp[root]; }
#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...