#include<bits/stdc++.h>
using namespace std;
const int N=4e4+10;
inline int read(){
int f=1,x=0; char ch=getchar();
while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); }
while(isdigit(ch)) { x=x*10+ch-48; ch=getchar(); }
return f*x;
}
int n,k;
int head[N],cnt,ans;
int rt,mx[N],siz[N];
bool vis[N];
class BIT{
private:
int a[N],n;
int lb(int x){return x&-x;}
public:
void init(int x) { n=x; };
void add(int p,int x) { p++; for(;p<=n;p+=lb(p)) a[p]+=x; }
int sum(int p){
int ans=0; p++;
for(;p;p-=lb(p)) ans+=a[p];
return ans;
}
}t;
struct EDGE{
int t,nxt;
int w;
}l[N<<1];
void add(int a,int b,int c){
l[++cnt].nxt=head[a];
l[cnt].t=b;
l[cnt].w=c;
head[a]=cnt;
}
void find(int u,int fa,int s){
siz[u]=1,mx[u]=0;
for(int i=head[u];i;i=l[i].nxt){
int v=l[i].t;
if(vis[v]||v==fa) continue;
find(v,u,s);
mx[u]=max(mx[u],siz[v]);
}
mx[u]=max(mx[u],s-siz[u]);
if(mx[u]<mx[rt]) rt=u;
}
int stk[N],top,r[N],tp;
void get_dis(int u,int fa,int dis){
if(dis>k)return;
r[++tp]=dis;
for(int i=head[u];i;i=l[i].nxt){
int v=l[i].t;
if(vis[v]||v==fa) continue;
get_dis(v,u,dis+l[i].w);
}
}
void solve(int u){
top=0;
for(int i=head[u];i;i=l[i].nxt){
int v=l[i].t;
if(vis[v]) continue;
tp=0;
get_dis(v,u,l[i].w);
for(int j=1;j<=tp;j++) if(r[j]<=k) ans+=t.sum(k-r[j])+1;
for(int j=1;j<=tp;j++) if(r[j]<=k) stk[++top]=r[j],t.add(r[j],1);
}
while(top) t.add(stk[top--],-1);
return;
}
void del(int u){
vis[u]=1;
solve(u);
for(int i=head[u];i;i=l[i].nxt){
int v=l[i].t;
if(vis[v]) continue;
rt=0;
find(v,u,siz[v]);
del(rt);
}
return;
}
int main(void){
n=read();
int a,b,c;
for(int i=1;i<n;i++){
a=read(),b=read(),c=read();
add(a,b,c); add(b,a,c);
}
k=read();
t.init(k+2);
mx[0]=n+1;
find(1,0,n);
del(rt);
printf("%d\n",ans);
return 0;
}
萌新刚学OI求助!!!
莫名被 T 成了30分。。。
除了2、3、4都被 T 了
自我感觉非常良好。。。应该不是常数的问题。。。
可能是由NT错误。。求大佬指点。