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

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

  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/qwerta/p/9379756.html
Copyright © 2011-2022 走看看