代码 50 分,WA on #1 #7 #8 #9 #10,下载样例一运行代码后发现答案与样例相同,但是依然 WA on #1。测试机表示我的代码输出的第一个字符为 '3',但本地输出 '7' 与答案相同。
#include<bits/stdc++.h>
#define _v p.first
#define _w p.second
#define lb(x) (-x&x)
using namespace std;
const int N(4e4+5);
const int V(2e4);
vector<pair<int,int>>e[N];
int del[N],siz[N],mxs,sum,root;
int dis[N],d[N],cnt;
long long ans;
int q[V+5];
int judge[V+5];
int n,m,k;
int tr[N<<2];
inline void modify(int p,int l,int r,int id,int w){
tr[p]+=w;
if(l==r)
return;
if(id<=l+r>>1)modify(p<<1,l,l+r>>1,id,w);
else modify(p<<1|1,(l+r>>1)+1,r,id,w);
return;
}
inline int query(int p,int l,int r,int L,int R){
if(L<=l&&r<=R)
return tr[p];
return ((L<=l+r>>1)?query(p<<1,l,l+r>>1,L,R):0)+((R>l+r>>1)?query(p<<1|1,(l+r>>1)+1,r,L,R):0);
}
inline void getroot(int u,int fa){
siz[u]=1;
int s=0;
for(auto p:e[u]){
if(_v==fa||del[_v])continue;
getroot(_v,u);
siz[u]+=siz[_v];
s=max(s,siz[_v]);
}
s=max(s,sum-siz[u]);
if(s<mxs)mxs=s,root=u;
}
inline void getdis(int u,int fa){
dis[++cnt]=d[u];
for(auto p:e[u]){
if(_v==fa||del[_v])continue;
d[_v]=d[u]+_w;
getdis(_v,u);
}
}
inline void calc(int u){
del[u]=1;
int tp=0;
for(auto p:e[u]){
if(del[_v])continue;
cnt=0;
d[_v]=_w;
getdis(_v,u);
for(int i=1;i<=cnt;i++)
if(k>=dis[i])
ans+=query(1,0,V,0,k-dis[i]);
for(int i=1;i<=cnt;i++)
if(dis[i]<=V){
q[++tp]=dis[i];
modify(1,0,V,dis[i],1);
}
}
for(int i=1;i<=tp;i++)modify(1,0,V,q[i],-1);
}
inline void divide(int u){
calc(u);
for(auto p:e[u]){
if(del[_v])continue;
mxs=sum=siz[_v];
getroot(_v,0);
divide(root);
}
}
int main(){
// freopen("c.in","r",stdin);
scanf("%d",&n);
for(int i=1,u,v,w;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
e[u].emplace_back(v,w);
e[v].emplace_back(u,w);
}
scanf("%d",&k);
modify(1,0,V,0,1);
mxs=sum=n;
getroot(1,0);
divide(root);
printf("%lld\n",ans);
return 0;
}