Submission #1359163

#TimeUsernameProblemLanguageResultExecution timeMemory
1359163NewtonabcCollecting Stamps 5 (JOI26_stamps)C++20
100 / 100
2777 ms69376 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e5+10;
vector<int> adj[N];
bool bk[N];
int t[N],dp[N],con[N],sz[N],d[N],ans[N],ret[N],dt,n;
struct UWU{
    vector<int> fw;
    int SZ;
    void init(int n){fw.resize(n+1,0); SZ=n;}
    void upd(int i,int val){i++; if(i>=SZ) return; for(;i<SZ;i+=i&-i) fw[i]+=val;}
    int qry(int i){i++; int s=0; for(;i;i-=i&-i) s+=fw[i]; return s;}
    void clr(){fw.clear();}
}T,Tp;
void fsz(int u,int p){
    sz[u]=1;
    for(auto v:adj[u]){
        if(v==p || bk[v]) continue;
        fsz(v,u);
        sz[u]+=sz[v];
    }
}
void fdep(int u,int p){
    for(auto v:adj[u]){
        if(v==p || bk[v]) continue;
        d[v]=d[u]+1;
        fdep(v,u);
    }
}
int cen(int u,int p,int c){
    for(auto v:adj[u]){
        if(v==p || bk[v]) continue;
        if(sz[v]*2>c) return cen(v,u,c);
    }
    return u;
}
void dfs(int u,int p){
    for(auto v:adj[u]){
        if(v==p || bk[v]) continue;
        dp[v]=min(dp[u],t[v]-d[v]);
        con[v]=min(con[u],t[v]+d[v]);
        dfs(v,u);
    }
}
void upd(int u,int p,int val){
    int l=dp[u],r=dt-d[u];
    l=max(l,0),r=min(r,N);
    if(0<=r) Tp.upd(0,val),Tp.upd(r+1,-val);
    if(l<=r) T.upd(l,val),T.upd(r+1,-val);
    for(auto v:adj[u]){
        if(v==p || bk[v]) continue;
        upd(v,u,val);
    }
}
void fd(int u,int p){
    if(d[u]>=con[u]) ret[u]+=Tp.qry(d[u]);
    else ret[u]+=T.qry(d[u]);
    for(auto v:adj[u]){
        if(v==p || bk[v]) continue;
        fd(v,u);
    }
}
void dec(int u,int p){
    fsz(u,u);
    T.init(sz[u]+10),Tp.init(sz[u]+10);
    int c=cen(u,u,sz[u]);
    d[c]=0;
    fdep(c,c);
    dp[c]=t[c];
    con[c]=t[c];
    dfs(c,c);
    upd(c,c,1);
    if(d[c]>=con[c]) ret[c]+=Tp.qry(d[c]);
    else ret[c]+=T.qry(d[c]);
    for(auto v:adj[c]){
        if(bk[v]) continue;
        upd(v,c,-1);
        fd(v,c);
        upd(v,c,1);
    }
    upd(c,c,-1);
    bk[c]=1;
    T.clr(),Tp.clr();
    for(auto v:adj[c]){
        if(bk[v]) continue;
        dec(v,c);
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n >>dt;
    for(int i=1;i<=n;i++) cin>>t[i];
    for(int i=0;i<n-1;i++){
        int u,v; cin>>u >>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dec(1,-1);
    for(int i=1;i<=n;i++) cout<<ret[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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...