Submission #1188346

#TimeUsernameProblemLanguageResultExecution timeMemory
1188346user736482Cat Exercise (JOI23_ho_t4)C++20
100 / 100
381 ms136512 KiB
#pragma GCC optimize("Ofast","unroll-loops","inline") #pragma GCC target("avx2") #include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define pb push_back #define ff first #define ss second #define MOD 1000000009 #define INF 1000000019 #define INFL 1000000000000000099LL #define POT (1<<20) ll a,b,r,c,t,n,m,l,q,k,ak,ans,s; ll wys[200007],pre[200007],mxpre[200007],kto[200007],gdzie[200007],dpt[200007],pier[200007]; ll mn[400007][20]; pair<ll,ll> sgtree[POT]; vector<ll>g[200007],d[200007],pth; void upd(ll v){ if(!v)return; sgtree[v]=max(sgtree[v*2],sgtree[v*2+1]); upd(v/2); } pair<ll,ll>mx(ll pocz,ll kon,ll l,ll r,ll v){ if(l>kon || r<pocz)return {0,0}; if(l>=pocz && r<=kon)return sgtree[v]; return max(mx(pocz,kon,l,(l+r)/2,v*2),mx(pocz,kon,(l+r)/2+1,r,v*2+1)); } void dfs(ll v,ll pop,ll dpth){ pre[v]=ak; kto[ak]=v; dpt[v]=dpth; pier[v]=pth.size(); pth.pb(ak); ak++; for(ll i : g[v]){ if(i==pop)continue; d[v].pb(i); dfs(i,v,dpth+1); pth.pb(pre[v]); } mxpre[v]=ak-1; } ll lca(ll a,ll b){ a=pier[a];b=pier[b]; if(a>b)swap(a,b); ll pom=log2(b-a+1); return kto[min(mn[a][pom],mn[b-(1<<pom)+1][pom])]; } void zero(ll v){ if(sgtree[POT/2+pre[v]].ff==0)return; sgtree[POT/2+pre[v]]={0,0}; upd((POT/2+pre[v])/2); for(ll i : d[v])zero(i); } ll policz(ll v){ pair<ll,ll> pom=mx(pre[v]+1,mxpre[v]+1,1,POT/2,1); if(pom.ff==0)return 0; ll nw=pom.ss; ll bst=0; for(ll i : d[nw]){ if(sgtree[POT/2+pre[i]].ff==0)continue; ll p=mx(pre[i]+1,mxpre[i]+1,1,POT/2,1).ss; bst=max(bst,policz(i)-2*dpt[lca(p,nw)]+dpt[p]+dpt[nw]); } zero(nw); if(nw!=v){ ll p=mx(pre[v]+1,mxpre[v]+1,1,POT/2,1).ss; bst=max(bst,policz(v)-2*dpt[lca(p,nw)]+dpt[p]+dpt[nw]);} return bst; } int main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n; for(ll i=1;i<=n;i++){cin>>wys[i];gdzie[wys[i]]=i;} for(ll i=1;i<n;i++){ cin>>a>>b; g[a].pb(b); g[b].pb(a); } dfs(1,-1,0); for(ll i=0;i<pth.size();i++)mn[i][0]=pth[i]; for(ll j=1;j<20;j++){ for(ll i=0;i+(1<<j)-1<pth.size();i++){ mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]); } } for(ll i=0;i<n;i++){ sgtree[POT/2+i]={wys[kto[i]],kto[i]}; upd((POT/2+i)/2); } cout<<policz(1); 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...