zoukankan      html  css  js  c++  java
  • 「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

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

  • 相关阅读:
    语义web服务发现实验框架
    Shiro的标签说明
    oj2694 逆波兰表达式
    poj1164 The Castle
    poj1161 Walls
    nyoj19 擅长排列的小明
    poj1664 放苹果
    nyoj236 心急的C小加
    oj2755 神奇的口袋
    poj1979 Red and Black
  • 原文地址:https://www.cnblogs.com/qwerta/p/9379756.html
Copyright © 2011-2022 走看看