「LuoguP3252」 [JLOI2012]樹

Description


在這個問題中,給定一個值S和一棵樹。在樹的每個節點有一個正整數,問有多少條路徑的節點總和達到S。路徑中節點的深度必須是升序的。假設節點1是根節點,根的深度是0,它的兒子節點的深度爲1。路徑不必一定從根節點開始。

Input


第一行是兩個整數N和S,其中N是樹的節點數。 第二行是N個正整數,第i個整數表示節點i的正整數。 接下來的N-1行每行是2個整數x和y,表示y是x的兒子。

Output


輸出路徑節點總和爲S的路徑數量。

Sample Input


3 3
1 2 3
1 2
1 3

Sample Output


2

Hint


對於100%數據,N<=100000,所有權值以及S都不超過1000。

題解


建了樹之後對每個點從下往上搜 如果點權加起來超過S就return 或者如果到了根也return

如果加到s就ans++

數據很水 期望複雜度近似nlogn 這種解法可以用鏈隨便卡到n方

#include<cstdio>
#include<iostream>
using namespace std;
int a[100007];
int fa[100007];
int main()
{
    int n,s;
    scanf("%d%d",&n,&s);
    for(int i=1;i<=n;++i)
    scanf("%d",&a[i]);
    int x,y;
    for(int i=1;i<=n-1;++i)
    {
        scanf("%d%d",&x,&y);
        fa[y]=x;
    }
    fa[1]=0;
    int ans=0;
    for(int i=1;i<=n;++i)
    {
        int sn=0;
        int x=i;
        while(x)
        {
            sn+=a[x];
            if(sn==s){ans++;x=0;}
            else if(sn>s)x=0;
            else x=fa[x];
        }
    }
    cout<<ans;
    return 0;
}
發佈了31 篇原創文章 · 獲贊 5 · 訪問量 1878
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章