洛谷P3252 [JLOI2012]树
题目描述
在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。
输入输出格式
输入格式:
第一行是两个整数N和S,其中N是树的节点数。 第二行是N个正整数,第i个整数表示节点i的正整数。 接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
输出格式:
输出路径节点总和为S的路径数量。
输入输出样例
3 3 1 2 3 1 2 1 3
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]树相关推荐
- 洛谷 P3373 线段树2
洛谷 P3373 线段树2 mul和pls更新某区间左右子树sum的时候,别忘了回头更新这个区间的sum 只有在传递给子序列之后,父序列的lz标记才能清零.其他时候,lz标记只增不减 #include ...
- 洛谷P3373线段树
洛谷P3373 线段树模板题,主要对懒标的处理要求比较高. 有三种操作: 区间加法 区间乘法 区间求和查询 tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown, ...
- ●洛谷P3688 [ZJOI2017]树状数组
题链: https://www.luogu.org/problemnew/show/P3688 题解: 二维线段树. 先不看询问时l=1的特殊情况. 对于一个询问(l,r),如果要让错误的程序得到正确 ...
- 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)
P2590 [ZJOI2008]树的统计 I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问 ...
- 洛谷 P2590 [ZJOI2008]树的统计
P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...
- 洛谷P1873 砍树
题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米尔 ...
- 洛谷3384(树链剖分模板题)
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- CSP2019洛谷P5666:树的重心
解析 毒题 细节有亿点点多 我一开始的思路是没有问题的 尝试统计有多少种方案能砍出大小在一个区间的子树. 当时的想法是线段树合并 但是这个玩意在需要保留原树的情况下空间复杂度炸没了- 因为我垃圾的实现 ...
- 洛谷 P1377 [TJOI2011]树的序 解题报告
P1377 [TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值\(k\),则变为只有一个结点的二叉查找树,此结点的键值即为\(k ...
最新文章
- BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
- 2019年深度学习的十大预测
- [转]Android UI 自动化测试
- 飙着车学「机器学习」?要不是380万人围观我都不敢相信
- Java IO流及应用(一)
- 5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换
- java循环嵌套 0228 2101班
- [转帖] BMC安全隐患
- 设计模式学习与应用——单例模式
- File API文件操作之FileReader二
- 大神总结的图像处理学习路线
- 【安装】安装OpenCV简易教程
- jQuery.closest() 函数详解
- 【Watery DP】[Dota1002]光之守卫(Gandolf)
- h5底部输入框被键盘遮挡_总结几个移动端H5软键盘的大坑【实践】
- python列表获取最后一个元素的方法_Python中如何获取 list/OrderedDict 的 第一个/最后一个 元素...
- LeetCode C++基础面试题汇总附答案(一)
- 人生苦短我用python壁纸_人生苦短,我用python
- R分数复现 R-precision评估指标定量 文本生成图像R分数定量实验全流程复现(R-precision)定量评价实验踩坑避坑流程
- 技术干货:赛车游戏中最短路径和最小曲率路径算法