OIIIIIIII

「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方

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int a[100007];
 5 int fa[100007];
 6 int main()
 7 {
 8     int n,s;
 9     scanf("%d%d",&n,&s);
10     for(int i=1;i<=n;++i)
11     scanf("%d",&a[i]);
12     int x,y;
13     for(int i=1;i<=n-1;++i)
14     {
15         scanf("%d%d",&x,&y);
16         fa[y]=x;
17     }
18     fa[1]=0;
19     int ans=0;
20     for(int i=1;i<=n;++i)
21     {
22         int sn=0;
23         int x=i;
24         while(x)
25         {
26             sn+=a[x];
27             if(sn==s){ans++;x=0;}
28             else if(sn>s)x=0;
29             else x=fa[x];
30         }
31     }
32     cout<<ans;
33     return 0;
34 }

 UPD

好像卡不到n方......好像构造数据的时候把从上往下搜的卡了一下(上面点权小最下面一个点权天大是可以卡到n方的),从下往上的就卡不住了2333

这个故事告诉我们就算写暴力也不要写的跟大多数人一样,坐等被卡呢。

posted @ 2018-07-13 16:14  qwertaya  阅读(155)  评论(0编辑  收藏  举报
MDZX
Changsha
Fulan