Advertisement
yicongli

LG4178

Mar 4th, 2019
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=40005;
  17. const int INF=1e9;
  18.  
  19. int n,m;
  20.  
  21. int ecnt;
  22. int fir[N],nex[N<<1],to[N<<1],w[N<<1];
  23.  
  24. inline void addedge(int u,int v,int c){
  25.     nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
  26.     nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=c;
  27. }
  28.  
  29. int SIZE,root;
  30. int s[N];
  31. int siz[N];
  32. bool vis[N];
  33. //getroot
  34. void dfs1(int x,int f){
  35.     siz[x]=1;
  36.     s[x]=0;
  37.     for(int i=fir[x];i;i=nex[i]){
  38.         int v=to[i];
  39.         if(v==f||vis[v])continue;
  40.         dfs1(v,x);
  41.         siz[x]+=siz[v];
  42.         s[x]=max(s[x],siz[v]);
  43.     }
  44.     s[x]=max(s[x],SIZE-siz[x]);
  45.     if(s[x]<s[root])root=x;
  46. }
  47. //getdis
  48. int dis[N];
  49. int tot,tmp[N];
  50. void dfs3(int x,int f){
  51.     tmp[++tot]=dis[x];
  52.     for(int i=fir[x];i;i=nex[i]){
  53.         int v=to[i];
  54.         if(v==f||vis[v])continue;
  55.         dis[v]=dis[x]+w[i];
  56.         dfs3(v,x);
  57.     }
  58. }
  59.  
  60. inline ll calc(int x,int v){
  61.     tot=0;
  62.     dis[x]=v;
  63.     dfs3(x,0);
  64.     sort(tmp+1,tmp+tot+1);
  65.     int l=1,r=tot;
  66.     ll sum=0;
  67.     while(l<r){
  68.         if(tmp[l]+tmp[r]<=m){
  69.             sum+=r-l;
  70.             ++l;
  71.         }
  72.         else --r;
  73.     }
  74.     return sum;
  75. }
  76. ll ans;
  77. //solve
  78. void dfs2(int x){
  79.     ans+=calc(x,0);
  80.     vis[x]=1;
  81.     for(int i=fir[x];i;i=nex[i]){
  82.         int v=to[i];
  83.         if(vis[v])continue;
  84.         ans-=calc(v,w[i]);
  85.         root=0;
  86.         SIZE=siz[v];
  87.         dfs1(v,0);
  88.         dfs2(root);
  89.     }
  90. }
  91.  
  92. int main(){
  93. //  freopen(".in","r",stdin);
  94. //  freopen(".out","w",stdout);
  95.     r(n);
  96.     for(int i=1;i<n;++i){
  97.         int u,v,w;
  98.         r(u),r(v),r(w);
  99.         addedge(u,v,w);
  100.     }
  101.     r(m);
  102.     s[root]=SIZE=n;
  103.     dfs1(1,0);
  104.     dfs2(root);
  105.     printf("%lld\n",ans);
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement