Submission #1180834

#TimeUsernameProblemLanguageResultExecution timeMemory
1180834user736482Unique Cities (JOI19_ho_t5)C++20
64 / 100
745 ms69048 KiB
#pragma GCC optimize("O3")
#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 POT (1<<20)
#define INFL 1000000000000000099

ll n,q,s,t,a,b,c,ans,k,e,m,pier,h,w,u;
ll sgtree[POT];
ll ile[200007];
ll co[200007],wyn1[200007],wyn2[200007],dpt1[200007],dpt2[200007],roz1[200007],roz2[200007];
vector<ll>g[200007],d[200007],d2[200007];

void ff(ll x){
    x++;
    x=co[x];
    ile[x]++;
    if(ile[x]==1)ans++;
}
void fff(ll x){
    x++;
    x=co[x];
    ile[x]--;
    if(ile[x]==0)ans--;
}

void add(ll pocz,ll kon,ll l, ll r,ll v,ll val){
    if(pocz>r || kon<l)return;
    if(pocz<=l && kon>=r)sgtree[v]+=val;
    else{
        add(pocz,kon,l,(l+r)/2,v*2,val);
        add(pocz,kon,(l+r)/2+1,r,v*2+1,val);
    }
}

ll sm(ll v){
    if(v==0)return 0;
    return sgtree[v]+sm(v/2);
}

pair<ll,ll>dfs(ll v,ll pop){
    pair<ll,ll>bst={-1,v};
    for(ll i : g[v]){
        if(i==pop)continue;
        
        bst=max(bst,dfs(i,v));
    }
    bst.ff++;
    return  bst;
}
void dfs2(ll v,ll pop,ll dpth){
    dpt1[v]=dpth;
    for(ll i : g[v]){
        if(i==pop)continue;
        dfs2(i,v,dpth+1);
        roz1[v]=max(roz1[v],1+roz1[i]);
        d[v].pb(i);
    }
    //cout<<v<<" "<<dpt1[v]<<" "<<roz1[v]<<"\n";
    
}
void dfs3(ll v,ll pop,ll dpth){
    dpt2[v]=dpth;
    for(ll i : g[v]){
        if(i==pop)continue;
        dfs3(i,v,dpth+1);
        roz2[v]=max(roz2[v],1+roz2[i]);
        d2[v].pb(i);
    }
    
}
void dfs4(ll v){
   // cout<<v<<"    ";
    add(1+max(0LL,dpt1[v]-roz1[v]-2),dpt1[v]-1,1,POT/2,1,-1);
   // cout<<1+max(0LL,dpt1[v]-roz1[v]-2)<<" "<<dpt1[v]-1<<"\n";
   // cout<<"xd"<<flush;
    for(ll i : d[v]){
        add(1+max(0LL,dpt1[v]-roz1[i]-1),dpt1[v],1,POT/2,1,1);
    //    cout<<1+max(0LL,dpt1[v]-roz1[i]-1)<<" "<<dpt1[v]<<"\n";
    }
 //   cout<<ans<<" "<<sm(2+POT/2-1)<<" "<<dpt1[v]<<" "<<roz1[v]<<" "<<flush;
    if(dpt1[v]-roz1[v]>0)
    if(sm(dpt1[v]-roz1[v]+POT/2-1)==0){ff(dpt1[v]-roz1[v]-1);//cout<<dpt1[v]-roz1[v]<<" ";
        
    }
    if(dpt1[v]-roz1[v]>1)
    if(sm(dpt1[v]-roz1[v]-1+POT/2-1)==0){ff(dpt1[v]-roz1[v]-1-1);//cout<<dpt1[v]-roz1[v]-1<<" ";
        
    }
    wyn1[v]=ans;
  //  cout<<ans<<"\n";
    for(ll i : d[v])
        dfs4(i);
   
    if(dpt1[v]-roz1[v]>0)
    if(sm(dpt1[v]-roz1[v]+POT/2-1)==0)fff(dpt1[v]-roz1[v]-1);
    if(dpt1[v]-roz1[v]>1)
    if(sm(dpt1[v]-roz1[v]-1+POT/2-1)==0)fff(dpt1[v]-roz1[v]-1-1);
     add(1+max(0LL,dpt1[v]-roz1[v]-2),dpt1[v]-1,1,POT/2,1,1);
    for(ll i : d[v]){
        add(1+max(0LL,dpt1[v]-roz1[i]-1),dpt1[v],1,POT/2,1,-1);
    }
}

void dfs5(ll v){
    
    add(1+max(0LL,dpt2[v]-roz2[v]-2),dpt2[v]-1,1,POT/2,1,-1);
    
    for(ll i : d2[v]){
        add(1+max(0LL,dpt2[v]-roz2[i]-1),dpt2[v],1,POT/2,1,1);
    }
    if(dpt2[v]-roz2[v]>0)
    if(sm(dpt2[v]-roz2[v]+POT/2-1)==0)ff(dpt2[v]-roz2[v]-1);
    if(dpt2[v]-roz2[v]>1)
    if(sm(dpt2[v]-roz2[v]-1+POT/2-1)==0)ff(dpt2[v]-roz2[v]-1-1);
    wyn2[v]=ans;
    for(ll i : d2[v])
        dfs5(i);
    if(dpt2[v]-roz2[v]>0)
    if(sm(dpt2[v]-roz2[v]+POT/2-1)==0)fff(dpt2[v]-roz2[v]-1);
    if(dpt2[v]-roz2[v]>1)
    if(sm(dpt2[v]-roz2[v]-1+POT/2-1)==0)fff(dpt2[v]-roz2[v]-1-1);
    add(1+max(0LL,dpt2[v]-roz2[v]-2),dpt2[v]-1,1,POT/2,1,1);
    
    for(ll i : d2[v]){
        add(1+max(0LL,dpt2[v]-roz2[i]-1),dpt2[v],1,POT/2,1,-1);
    }
}

int main()
{
    //ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m;
    for(ll i=1;i<n;i++){
        cin>>a>>b;
        a--;
        b--;
        g[a].pb(b);
        g[b].pb(a);
    }
    for(ll i=0;i<n;i++){
        cin>>co[i];
    }
    w=dfs(0,-1).ss;
    u=dfs(w,-1).ss;
  //  cout<<u<<" "<<w<<"      ";
    dfs2(u,-1,0);//cout<<"\n\n";
    dfs3(w,-1,0);
    dfs4(u);//cout<<"\n\n";
    dfs5(w);
    for(ll i=0;i<n;i++){
        if(dpt1[i]>dpt2[i])
            cout<<wyn1[i]<<"\n";
        else
            cout<<wyn2[i]<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...