刚才统计的是长度为k的个数,现在改成了树状数组(
为什么全WA啊/kel 求助dalao/kel/kel/kel
#include<cstdio>
const int M=4e4+5,INF=0x7fffffff;
struct Edge{
int to,val;
Edge*nx;
}e[M<<1],*h[M],*cnt=e;
inline int max(const int a,const int b){
return a>b?a:b;
}
inline void Add(int x,int y,int val){
*cnt=(Edge){y,val,h[x]};h[x]=cnt++;
*cnt=(Edge){x,val,h[y]};h[y]=cnt++;
}
int n,k,id,top,d[M],siz[M];bool vis[M];
long long ans;
int CB[20005];
inline void Modify(int a,int val){
for(;a<=k;a+=1<<__builtin_ctz(a))CB[a]+=val;
}
inline int Query(int a){
if(!a)return 1;
int ans=0;
for(;a>=1;a-=1<<__builtin_ctz(a))ans+=CB[a];
return ans;
}
void init(int u,int f){
siz[u]=1;
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v!=f&&!vis[v]){
init(v,u);
siz[u]+=siz[v];
}
}
}
int SIZ,root;
void GetRoot(int rt,int u,int f){
int ans=0;
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v!=f&&!vis[v]){
GetRoot(rt,v,u);
ans=max(ans,siz[v]);
}
}
ans=max(ans,siz[rt]-siz[u]);
if(ans<SIZ)SIZ=ans,root=u;
}
void DFS(int u,int f,int len){
if(len>k)return;
ans+=Query(k-len);
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v!=f&&!vis[v]){
DFS(v,u,len+E->val);
}
}
d[++top]=len;
}
void Solve(int u){
vis[u]=true;
Edge*E;
for(E=h[u];E;E=E->nx){
++id;
if(!vis[E->to])DFS(E->to,u,E->val);
for(;id<=top;++id)Modify(CB[d[id]],1);
}
for(int i=1;i<=top;++i)CB[d[i]]=0;
id=top=0;
for(E=h[u];E;E=E->nx){
int v=E->to;
if(vis[v])continue;
SIZ=INF;
GetRoot(v,v,0);
init(root,0);
Solve(root);
}
}
signed main(){
int i,x,y,z;
scanf("%d",&n);
for(i=1;i<n;++i){
scanf("%d%d%d",&x,&y,&z);
Add(x,y,z);
}
scanf("%d",&k);
init(1,0);
SIZ=INF;
GetRoot(1,1,0);
init(root,0);
Solve(root);
printf("%lld",ans);
}