제출 #360040

#제출 시각아이디문제언어결과실행 시간메모리
360040keta_tsimakuridzeConstruction of Highway (JOI18_construction)C++14
100 / 100
1462 ms20844 KiB
#include<bits/stdc++.h> #define ll long long #define f first #define s second using namespace std; const int N=1e5+5; int sz[N],par[N],lazy[4*N],ind[N],c[N],cur,idx,k,i,a[N],b[N],n,st[N],f[N],ch[N],s[N]; pair<int,int>d[N],tree[4*N]; vector<int>V[N]; void dfs(int u,int p){ sz[u]=1; par[u]=p; for(int i=0;i<V[u].size();i++){ if(V[u][i]!=p) dfs(V[u][i],u),sz[u]+=sz[V[u][i]]; } } void update(int u,int start,int end,int l,int r,int val){ if(lazy[u]){ tree[u]={lazy[u],lazy[u]}; if(l!=r){ lazy[2*u]=lazy[u]; lazy[2*u+1]=lazy[u]; } lazy[u]=0; } if(l>end || r<start) return; if(start<=l && r<=end) { tree[u]={val,val}; if(l!=r){ lazy[2*u]=val; lazy[2*u+1]=val; } return; } int mid=(l+r)/2; update(2*u,start,end,l,mid,val); update(2*u+1,start,end,mid+1,r,val); tree[u].f=min(tree[2*u].f,tree[2*u+1].f); tree[u].s=max(tree[2*u].s,tree[2*u+1].s); } pair<int,int> getans(int u,int start,int end,int l,int r){ if(lazy[u]){ tree[u]={lazy[u],lazy[u]}; if(l!=r){ lazy[2*u]=lazy[u]; lazy[2*u+1]=lazy[u]; } lazy[u]=0; } if(l>end || r<start) return {n+1,0}; if(start<=l && r<=end) { return tree[u]; } int mid=(l+r)/2; pair<int,int> g1=getans(2*u,start,end,l,mid); pair<int,int> g2=getans(2*u+1,start,end,mid+1,r); return {min(g1.f,g2.f),max(g1.s,g2.s)}; } void hld(int u,int p){ if(!st[cur]) st[cur]=u; idx++; ind[u]=idx; s[idx]=u; ch[u]=cur; int mx=0,v=0; for(int i=0;i<V[u].size();i++){ if(V[u][i]==p) continue; if(mx<sz[V[u][i]]) { mx=sz[V[u][i]]; v=V[u][i]; } } if(v) hld(v,u); for(int i=0;i<V[u].size();i++){ if(V[u][i]==p || V[u][i]==v) continue; cur++; hld(V[u][i],u); } } void update(int ind,int val){ for(ind;ind<=n;ind+=ind&(-ind)) f[ind]+=val; } ll getans(int ind){ ll pas=0; for(ind;ind>=1;ind-=ind&(-ind)) pas+=f[ind]; return pas; } ll upd(int u,int val){ vector<pair<int,int> >v; long long ans = 0,U=u; update(1,ind[u],ind[u],1,n,val); u=par[u]; while(u){ int l=ind[st[ch[u]]],r=ind[u],col=0; while(l<=r){ int mid=(l+r)/2; pair<int,int> g=getans(1,mid,ind[u],1,n); if(g.first==g.second) { idx=mid; col=g.first; r=mid-1; } else l=mid+1; } update(1,idx,ind[u],1,n,val); ans += getans(col-1) *(ll)(-idx+ind[u]+1); update(col,-idx+ind[u]+1); v.push_back({col,-idx+ind[u]+1}); u=par[s[idx]]; } for(int i=0;i<v.size();i++){ update(v[i].f,-v[i].s); } return ans; } main(){ ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin>>n; for(k=1;k<=n;k++){ cin>>c[k]; d[k]={c[k],k}; } sort(d+1,d+n+1); cur=0; for(k=1;k<=n;k++){ if(d[k].f!=d[k-1].f) cur++; c[d[k].second]=cur; } cur=1; for(k=1;k<n;k++){ cin>>a[k]>>b[k]; V[a[k]].push_back(b[k]); V[b[k]].push_back(a[k]); } dfs(1,0); hld(1,0); update(1,ind[1],ind[1],1,n,c[1]); for(k=1;k<n;k++){ cout<<upd(b[k],c[b[k]])<<" "; } }

컴파일 시 표준 에러 (stderr) 메시지

construction.cpp: In function 'void dfs(int, int)':
construction.cpp:12:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |  for(int i=0;i<V[u].size();i++){
      |              ~^~~~~~~~~~~~
construction.cpp: In function 'void hld(int, int)':
construction.cpp:65:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |  for(int i=0;i<V[u].size();i++){
      |              ~^~~~~~~~~~~~
construction.cpp:73:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |  for(int i=0;i<V[u].size();i++){
      |              ~^~~~~~~~~~~~
construction.cpp: In function 'void update(int, int)':
construction.cpp:80:6: warning: statement has no effect [-Wunused-value]
   80 |  for(ind;ind<=n;ind+=ind&(-ind))
      |      ^~~
construction.cpp: In function 'long long int getans(int)':
construction.cpp:85:6: warning: statement has no effect [-Wunused-value]
   85 |  for(ind;ind>=1;ind-=ind&(-ind))
      |      ^~~
construction.cpp: In function 'long long int upd(int, int)':
construction.cpp:111:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |  for(int i=0;i<v.size();i++){
      |              ~^~~~~~~~~
construction.cpp:91:20: warning: unused variable 'U' [-Wunused-variable]
   91 |  long long ans = 0,U=u;
      |                    ^
construction.cpp: At global scope:
construction.cpp:116:7: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  116 |  main(){
      |       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...