Submission #769261

#TimeUsernameProblemLanguageResultExecution timeMemory
769261Mohammad_ParsaConstruction of Highway (JOI18_construction)C++17
100 / 100
928 ms24148 KiB
/* in the name of allah */ #include<bits/stdc++.h> using namespace std; //#define endl '\n' #define pb push_back #define F first #define S second #define mk make_pair #define lc (2*id) #define rc (2*id+1) #define md ((s+e)/2) #define ln (e-s+1) typedef long long ll; const int N=1e5+7,lg=20; int n,c[N],a[N],b[N],h[N],p[N],fen[N],sp[N][lg],x; int seg[4*N],st[N],fn[N],T; pair<int,int>com[N]; ll ans[N]; vector<int>vec[N]; vector<pair<int,int>>vc; void upd(int i,int x){ for(;i<N;i+=i&(-i)){ fen[i]+=x; } } int get(int i){ int ans=0; for(;i;i-=i&(-i)){ ans+=fen[i]; } return ans; } void upds(int k,int x,int id=1,int s=1,int e=n){ if(ln==1){ seg[id]=x; return; } if(k<=md) upds(k,x,lc,s,md); else upds(k,x,rc,md+1,e); seg[id]=max(seg[lc],seg[rc]); } int gets(int l,int r,int id=1,int s=1,int e=n){ if(l>e || s>r){ return 0; } if(s>=l && e<=r){ return seg[id]; } return max(gets(l,r,lc,s,md),gets(l,r,rc,md+1,e)); } int lca(int u,int v){ for(int i=lg-1;i>=0;i--){ if(h[sp[u][i]]>=h[v]){ u=sp[u][i]; } if(h[sp[v][i]]>=h[u]){ v=sp[v][i]; } } for(int i=lg-1;i>=0;i--){ if(sp[u][i]!=sp[v][i]){ u=sp[u][i]; v=sp[v][i]; } } return u; } void dfs(int v=1){ st[v]=++T; for(auto u:vec[v]){ dfs(u); } fn[v]=T; } int main(){ ios:: sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>c[i]; com[i]=mk(c[i],i); } int k=1; sort(com,com+n+1); for(int i=1;i<=n;i++){ c[com[i].S]=k; if(com[i].F!=com[i+1].F)k++; } for(int i=0;i<n-1;i++){ cin>>a[i]>>b[i]; p[b[i]]=a[i]; h[b[i]]=h[a[i]]+1; sp[b[i]][0]=a[i]; vec[a[i]].pb(b[i]); } dfs(); for(int j=1;j<lg;j++){ for(int i=1;i<=n;i++){ sp[i][j]=sp[sp[i][j-1]][j-1]; } } upds(1,1); b[-1]=1; for(int i=0;i<n-1;i++){ int u=1; vc.clear(); while(u!=b[i]){ int v; int x=b[gets(st[u],fn[u])-2]; //cout<<u<<endl; if(u==a[i])v=b[i]; else v=lca(a[i],x); ll t=h[v]-h[u]; ans[i]+=t*(get(N-1)-get(c[x])); upd(c[x],t); vc.pb(mk(c[x],t)); u=v; } for(auto [p,q]:vc){ upd(p,-q); } upds(st[b[i]],i+2); cout<<ans[i]<<endl; } }

Compilation message (stderr)

construction.cpp: In function 'int main()':
construction.cpp:112:6: warning: array subscript -1 is below array bounds of 'int [100007]' [-Warray-bounds]
  112 |  b[-1]=1;
      |  ~~~~^
construction.cpp:18:17: note: while referencing 'b'
   18 | int n,c[N],a[N],b[N],h[N],p[N],fen[N],sp[N][lg],x;
      |                 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...