注意是等于s不是大于s
dfs,用set或者map存这条链到root的点权和sum[u],更新答案的时候查一下有没有s-sum[u]即可#include#include #include using namespace std;const int N=500005;int n,m,a[N],h[N],cnt,s[N],ans;set st;struct qwe{ int ne,to;}e[N<<1];int read(){ int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}void add(int u,int v){ cnt++; e[cnt].ne=h[u]; e[cnt].to=v; h[u]=cnt;}void dfs(int u,int fa){ s[u]=s[fa]+a[u]; st.insert(s[u]); if(st.count(s[u]-m)) ans++; for(int i=h[u];i;i=e[i].ne) if(e[i].to!=fa) dfs(e[i].to,u); st.erase(s[u]);}int main(){ n=read(),m=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i