We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
#include<iostream>#include<vector>#include<algorithm>#include<cassert>usingnamespacestd;// Aliases for common operations#define pb push_back#define pbk pop_back#define mp make_pair#define fs first#define sc second#define all(x) (x).begin(), (x).end()#define foreach(i, a) for (auto i = (a).begin(); i != (a).end(); ++i)#define len(a) ((int) (a).size())#ifdef CUTEBMAING#define eprintf(...) fprintf(stderr, __VA_ARGS__)#else#define eprintf(...) 42#endif// Type definitionstypedeflonglongint64;typedeflongdoubleld;typedefunsignedlonglonglint;constintinf=(1<<30)-1;constint64linf=(1ll<<62)-1;constintN=1e6+100;constintK=20;intn;vector<int>g[N];intbin[N][K],valMin[N][K],valMax[N][K];intin[N],out[N],curTime=0;// Depth-First Search (DFS) functionvoiddfs(intv,intp=-1){in[v]=curTime++;bin[v][0]=p;valMin[v][0]=min(v,p==-1?inf:p);valMax[v][0]=max(v,p);for(inti=1;i<K;i++){if(bin[v][i-1]==-1){bin[v][i]=-1;valMin[v][i]=valMin[v][i-1];valMax[v][i]=valMax[v][i-1];}else{bin[v][i]=bin[bin[v][i-1]][i-1];valMin[v][i]=min(valMin[v][i-1],valMin[bin[v][i-1]][i-1]);valMax[v][i]=max(valMax[v][i-1],valMax[bin[v][i-1]][i-1]);}}for(intto:g[v]){if(to!=p){dfs(to,v);}}out[v]=curTime++;}// Check if u is an ancestor of vinlineboolanc(intu,intv){returnin[u]<=in[v]&&out[v]<=out[u];}// Get the minimum value in the path from u to vinlineintsmallMin(intu,intv){if(anc(u,v))returninf;intans=inf;for(inti=K-1;i>=0;i--){if(bin[u][i]!=-1&&!anc(bin[u][i],v)){ans=min(ans,valMin[u][i]);u=bin[u][i];}}ans=min(ans,valMin[u][0]);assert(bin[u][0]!=-1);returnans;}inlineintgetMin(intu,intv){returnmin(smallMin(u,v),smallMin(v,u));}// Get the maximum value in the path from u to vinlineintsmallMax(intu,intv){if(anc(u,v))return-inf;intans=-inf;for(inti=K-1;i>=0;i--){if(bin[u][i]!=-1&&!anc(bin[u][i],v)){ans=max(ans,valMax[u][i]);u=bin[u][i];}}ans=max(ans,valMax[u][0]);assert(bin[u][0]!=-1);returnans;}inlineintgetMax(intu,intv){returnmax(smallMax(u,v),smallMax(v,u));}intnextL[N],nextR[N];vector<int>rmq[N*4];// Build the Range Minimum Query (RMQ) structurevoidmake_rmq(inti,intl,intr){if(l==r){rmq[i].pb(nextL[l]);return;}make_rmq(i*2,l,(l+r)/2);make_rmq(i*2+1,(l+r)/2+1,r);rmq[i].resize(len(rmq[i*2])+len(rmq[i*2+1]));merge(all(rmq[i*2]),all(rmq[i*2+1]),rmq[i].begin());}// Get the number of values in the range [l, r] less than vintgetValue(inti,intll,intrr,intl,intr,intv){if(ll>r||rr<l)return0;if(l<=ll&&rr<=r){returnupper_bound(all(rmq[i]),v)-rmq[i].begin();}returngetValue(i*2,ll,(ll+rr)/2,l,r,v)+getValue(i*2+1,(ll+rr)/2+1,rr,l,r,v);}intmain(){cin>>n;for(inti=0;i<n-1;i++){inta,b;scanf("%d%d",&a,&b);a--,b--;g[a].pb(b);g[b].pb(a);}dfs(0);vector<int>stack;stack.pb(0);for(inti=0;i<n;i++){nextR[i]=inf;nextL[i]=-inf;}int64ans=0;for(inti=1;i<n;i++){while(!stack.empty()&&getMin(stack.back(),i)!=stack.back()){nextR[stack.back()]=i;stack.pbk();}stack.pb(i);}stack.clear();stack.pb(n-1);for(inti=n-2;i>=0;i--){while(!stack.empty()&&getMax(stack.back(),i)!=stack.back()){nextL[stack.back()]=i;stack.pbk();}stack.pb(i);}make_rmq(1,0,n-1);for(inti=0;i<n;i++){ans+=getValue(1,0,n-1,i,nextR[i]-1,i-1);}cout<<ans<<endl;return0;}
Cookie support is required to access HackerRank
Seems like cookies are disabled on this browser, please enable them to open this website
Self-Driving Bus
You are viewing a single comment's thread. Return to all comments →