Submission #1160129

#TimeUsernameProblemLanguageResultExecution timeMemory
1160129elotelo966Cat Exercise (JOI23_ho_t4)C++20
0 / 100
2 ms5192 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 200005 #define mid (start+end)/2 #define pb push_back int n,l,ans; int dizi[lim],mp[lim]; vector<int> v[lim]; int timer,tin[lim],tout[lim],dist[lim]; int up[lim][35]; int par[lim],sz[lim],buy[lim],cev[lim]; inline void dfs(int node,int ata){ tin[node]=tout[node]=++timer; dist[node]=dist[ata]+1; up[node][0]=ata; for(int i=1;i<=l;i++){ up[node][i]=up[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 find(int node){ if(node==par[node])return node; return par[node]=find(par[node]); } inline void uni(int node1,int node2){ node1=find(node1); node2=find(node2); if(node1==node2)return ; // cout<<node1<<" "<<node2<<endl; int lca=find_lca(buy[node1],buy[node2]); int distance=dist[buy[node1]]+dist[buy[node2]]-2*dist[lca]; // if(sz[node1]<sz[node2])swap(node1,node2); if(dizi[buy[node1]]<dizi[buy[node2]])buy[node1]=buy[node2]; cev[node1]=max(cev[node1],cev[node2]+distance); par[node2]=node1; sz[node1]+=sz[node2]; } int32_t main(){ faster cin>>n; l=ceil(log2(n)); FOR{ cin>>dizi[i]; mp[dizi[i]]=i; par[i]=i; sz[i]=1; buy[i]=dizi[i]; } FOR{ if(i==1)continue; int x,y;cin>>x>>y; v[x].pb(y); v[y].pb(x); } dfs(1,0); FOR{ int node=mp[i]; for(auto go:v[node]){ if(dizi[go]<i){ uni(go,node); } } } //cout<<ans<<'\n'; int anss=0; FOR{ anss=max(anss,cev[find(i)]); } cout<<anss<<'\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...