#include<bits/stdc++.h>
#define MAXN 70007
using namespace std;
const int inf=2e9;
struct edge{
int to,cost;
};
int n,K,a,b,c;
long long ans[MAXN],sz[MAXN];
vector<edge> v[MAXN];
void calc(int x,int p){
sz[x]=1;
for(auto e:v[x]){
if(e.to==p)continue;
calc(e.to,x);
sz[x]+=sz[e.to];
}
}
void dfs(int x,int p,int up,long long d){
if(d<0){
ans[p]+=sz[x];
d=K-up;
}
for(auto e:v[x]){
if(e.to==p)continue;
dfs(e.to,x,e.cost,d-e.cost);
}
}
void solve_slow(){
for(int i=1;i<=n;i++){
calc(i,0);
dfs(i,0,0,K);
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<"\n";
}
}
int ed[MAXN],m,to[MAXN];
vector<int> tree[MAXN];
int ver[MAXN];
void dfs2(int x,int p){
for(auto e:v[x]){
if(e.to==p)continue;
m++; ed[m]=e.cost;
ver[m]=x; ver[m+1]=e.to;
dfs2(e.to,x);
}
}
void dfs3(int x){
sz[x]=1;
for(int i:tree[x]){
dfs3(i);
sz[x]+=sz[i];
}
}
void solve_line(){
for(int i=1;i<=n;i++){
if(v[i].size()==1){
dfs2(i,0); break;
}
}
int pt=1,sum=ed[1];
for(int i=1;i<=m;i++){
while(pt<m and sum+ed[pt+1]<=K){
pt++; sum+=ed[pt];
}
to[i]=pt+1;
sum-=ed[i];
}
for(int i=1;i<=m;i++){
tree[to[i]].push_back(i);
}
dfs3(n);
for(int i=1;i<=n;i++){
ans[ver[i]]+=(long long) (sz[i]-1) * (n-i);
tree[i].clear();
}
reverse(ed+1,ed+m+1);
reverse(ver+1,ver+n+1);
pt=1; sum=ed[1];
for(int i=1;i<=m;i++){
while(pt<m and sum+ed[pt+1]<=K){
pt++; sum+=ed[pt];
}
to[i]=pt+1;
sum-=ed[i];
}
for(int i=1;i<=m;i++){
tree[to[i]].push_back(i);
}
dfs3(n);
for(int i=1;i<=n;i++){
ans[ver[i]]+=(long long) (sz[i]-1) * (n-i);
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<"\n";
}
}
long long down[MAXN][11],up[MAXN][11],all[MAXN][11];
void dfs4(int x,int p){
for(auto e:v[x]){
if(e.to==p)continue;
dfs4(e.to,x);
}
for(int t=0;t<=K;t++){
for(auto e:v[x]){
if(t+e.cost<=K)down[x][t]+=down[e.to][t+e.cost];
if(t+e.cost==K){
for(int s=e.cost-1;s>=0;s--)down[x][t]+=down[e.to][s];
}
}
}
down[x][K]++;
}
void dfs5(int x,int p,int e){
if(p!=0){
for(int t=0;t<=K;t++){
if(t+e<=K)up[x][t]+=up[p][t+e];
if(t+e==K){
for(int s=e-1;s>=0;s--)up[x][t]+=up[p][s];
}
}
for(int t=0;t<=K;t++){
if(t+e<=K)down[p][t]-=down[x][t+e];
if(t+e==K){
for(int s=e-1;s>=0;s--)down[p][t]-=down[x][s];
}
}
down[p][K]--;
for(int t=0;t<=K;t++){
if(t+e<=K)up[x][t]+=down[p][t+e];
if(t+e==K){
for(int s=e-1;s>=0;s--)up[x][t]+=down[p][s];
}
}
down[p][K]++;
for(int t=0;t<=K;t++){
if(t+e<=K)down[p][t]+=down[x][t+e];
if(t+e==K){
for(int s=e-1;s>=0;s--)down[p][t]+=down[x][s];
}
}
}
up[x][K]++;
for(auto e:v[x]){
if(e.to==p)continue;
dfs5(e.to,x,e.cost);
}
for(int t=0;t<=K;t++){
all[x][t]=down[x][t]+up[x][t];
}
all[x][K]--;
}
void dfs6(int x,int p){
cout<<x<<" "<<p<<"\n";
for(auto e:v[x]){
if(e.to==p)continue;
dfs6(e.to,x);
}
for(auto e:v[x]){
long long szz=0;
if(e.to!=p){
szz=sz[e.to];
for(int t=0;t<=K;t++){
if(t+e.cost<=K)all[x][t]-=down[e.to][t+e.cost];
if(t+e.cost==K){
for(int s=e.cost-1;s>=0;s--)all[x][t]-=down[e.to][s];
}
}
}else{
szz=n-sz[x];
for(int t=0;t<=K;t++){
all[x][t]-=up[x][t];
}
}
for(int f=0;f<e.cost;f++)ans[x]+=all[x][f]*szz;
if(e.to!=p){
for(int t=0;t<=K;t++){
if(t+e.cost<=K)all[x][t]+=down[e.to][t+e.cost];
if(t+e.cost==K){
for(int s=e.cost-1;s>=0;s--)all[x][t]+=down[e.to][s];
}
}
}else{
for(int t=0;t<=K;t++){
all[x][t]+=up[x][t];
}
}
}
}
void solve_fast(){
calc(1,0);
dfs4(1,0);
dfs5(1,0,0);
dfs6(1,0);
for(int i=1;i<=n;i++){
cout<<ans[i]<<"\n";
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>K;
for(int i=1;i<=n-1;i++){
cin>>a>>b>>c;
a++; b++;
v[a].push_back({b,c});
v[b].push_back({a,c});
}
if(n<=1000){
solve_slow();
}else if(K<=10){
solve_fast();
}else{
solve_line();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |