题目描述

在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。

输入输出格式

输入格式:

第一行是两个整数N和S,其中N是树的节点数。 第二行是N个正整数,第i个整数表示节点i的正整数。 接下来的N-1行每行是2个整数x和y,表示y是x的儿子。

输出格式:

输出路径节点总和为S的路径数量。

输入输出样例

输入样例#1:

3 3
1 2 3
1 2
1 3

输出样例#1:

2

说明

对于100%数据,N<=100000,所有权值以及S都不超过1000。

题目大意:求树上连续一段深度递增的路径的点权和为s的条数

题解:dfs(i)以i为起点的路径有多少条

错因:理解错了 不能用记忆化搜索

数据水暴力可过

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
#define maxn 100008
using namespace std;int n,s,sumedge;
int head[maxn],w[maxn];
long long ans;struct Edge{int x,y,nxt;Edge(int x=0,int y=0,int nxt=0):x(x),y(y),nxt(nxt){}
}edge[maxn];void add(int x,int y){edge[++sumedge]=Edge(x,y,head[x]);head[x]=sumedge;
}LL dfs(int x,int sum){if(sum>s)return 0;if(sum==s)return 1;long long js=0;for(int i=head[x];i;i=edge[i].nxt){int v=edge[i].y;js+=dfs(v,sum+w[v]);}return js;
}int main(){scanf("%d%d",&n,&s);for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);}for(int i=1;i<=n;i++)if(w[i]==s)ans++;else ans+=dfs(i,w[i]);cout<<ans<<endl;return 0;
}

树上前缀和

保存搜到i之前的祖先,累加权值,是否sum[i]-sum[祖先]=s,注意搜完时删掉祖先。

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100008
#define LL long long
using namespace std;int n,s,sumedge,cnt,js;
int head[maxn],w[maxn],dad[maxn],fa[maxn],sum[maxn];
LL ans;struct Edge{int x,y,nxt;Edge(int x=0,int y=0,int nxt=0):x(x),y(y),nxt(nxt){}
}edge[maxn];void add(int x,int y){edge[++sumedge]=Edge(x,y,head[x]);head[x]=sumedge;
}void dfs(int x){dad[++js]=x;for(int i=head[x];i;i=edge[i].nxt){int v=edge[i].y;sum[v]=sum[x]+w[v];for(int j=js;j>=0;j--){//要循环到0,可能它自己的点权就是s if(sum[v]-sum[dad[j]]==s)ans++;if(sum[v]-sum[dad[j]]>s)break;}dfs(v);}js--;
}int main(){scanf("%d%d",&n,&s);for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);fa[y]=x;add(x,y);}sum[1]=w[1]; dfs(1);cout<<ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/zzyh/p/7593079.html

洛谷P3252 [JLOI2012]树相关推荐

  1. 洛谷 P3373 线段树2

    洛谷 P3373 线段树2 mul和pls更新某区间左右子树sum的时候,别忘了回头更新这个区间的sum 只有在传递给子序列之后,父序列的lz标记才能清零.其他时候,lz标记只增不减 #include ...

  2. 洛谷P3373线段树

    洛谷P3373 线段树模板题,主要对懒标的处理要求比较高. 有三种操作: 区间加法 区间乘法 区间求和查询 tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown, ...

  3. ●洛谷P3688 [ZJOI2017]树状数组

    题链: https://www.luogu.org/problemnew/show/P3688 题解: 二维线段树. 先不看询问时l=1的特殊情况. 对于一个询问(l,r),如果要让错误的程序得到正确 ...

  4. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)

    P2590 [ZJOI2008]树的统计 I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问 ...

  5. 洛谷 P2590 [ZJOI2008]树的统计

    P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...

  6. 洛谷P1873 砍树

    题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米尔 ...

  7. 洛谷3384(树链剖分模板题)

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  8. CSP2019洛谷P5666:树的重心

    解析 毒题 细节有亿点点多 我一开始的思路是没有问题的 尝试统计有多少种方案能砍出大小在一个区间的子树. 当时的想法是线段树合并 但是这个玩意在需要保留原树的情况下空间复杂度炸没了- 因为我垃圾的实现 ...

  9. 洛谷 P1377 [TJOI2011]树的序 解题报告

    P1377 [TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值\(k\),则变为只有一个结点的二叉查找树,此结点的键值即为\(k ...

最新文章

  1. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
  2. 2019年深度学习的十大预测
  3. [转]Android UI 自动化测试
  4. 飙着车学「机器学习」?要不是380万人围观我都不敢相信
  5. Java IO流及应用(一)
  6. 5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换
  7. java循环嵌套 0228 2101班
  8. [转帖] BMC安全隐患
  9. 设计模式学习与应用——单例模式
  10. File API文件操作之FileReader二
  11. 大神总结的图像处理学习路线
  12. 【安装】安装OpenCV简易教程
  13. jQuery.closest() 函数详解
  14. 【Watery DP】[Dota1002]光之守卫(Gandolf)
  15. h5底部输入框被键盘遮挡_总结几个移动端H5软键盘的大坑【实践】
  16. python列表获取最后一个元素的方法_Python中如何获取 list/OrderedDict 的 第一个/最后一个 元素...
  17. LeetCode C++基础面试题汇总附答案(一)
  18. 人生苦短我用python壁纸_人生苦短,我用python
  19. R分数复现 R-precision评估指标定量 文本生成图像R分数定量实验全流程复现(R-precision)定量评价实验踩坑避坑流程
  20. 技术干货:赛车游戏中最短路径和最小曲率路径算法

热门文章

  1. 远程控制virtual box虚拟机系统的三种方式
  2. 2022-2028年中国碘矿行业竞争格局分析及市场需求前景报告
  3. debian 10 静态ip配置
  4. Java中对象引用的机制,及特点
  5. MinkowskiPooling池化(下)
  6. CodeGen按钮循环
  7. 使用现场总线更快更远
  8. 什么是视觉Visual SLAM
  9. python 删除list 里面的一个空集合
  10. android 根据时间获取时间对应的星期