Multiply on the tree.
#include <iostream>#include<cstdio>#include<cstring>#defineMAXV 100500#defineMaxe 200500using namespacestd;structedge{intV,NXT;} E[maxe];intN,s,w[maxv],dis[maxv],x,y,nume=0, g[maxv],root,anc[maxv][ -],sum[maxv][ -],ans=0;BOOLVIS[MAXV];voidAddedge (intUintv) {e[++nume].v=v; E[NUME].NXT=G[u]; G[u]=Nume;}voidDfsintNow ) { for(intI=g[now];i;i=e[i].nxt) { intv=e[i].v; DIS[V]=dis[now]+1; anc[v][0]=Now ; sum[v][0]=W[now]; DFS (v); }}intFindintx) { intregis=w[x],now=x; for(intEe= +; ee>=0; ee--) { if(regis+sum[now][ee]<=s) {regis+=Sum[now][ee]; now=Anc[now][ee]; } } if(regis==s)return 1; return 0;}intMain () {scanf ("%d%d",&n,&s); for(intI=1; i<=n;i++) scanf ("%d",&W[i]); for(intI=1; i<=n-1; i++) {scanf ("%d%d",&x,&y); Addedge (x, y); Vis[y]=true; } for(intI=1; i<=n;i++) { if(vis[i]==false) Root=i; } dfs (root); for(intEe=1; ee<= +; ee++) for(intI=1; i<=n;i++) {Anc[i][ee]=anc[anc[i][ee-1]][ee-1]; Sum[i][ee]=sum[anc[i][ee-1]][ee-1]+sum[i][ee-1]; } for(intI=1; i<=n;i++) ans+=find (i); printf ("%d\n", ans); return 0;}
Bzoj 2783 Trees