[JLOI2012] 树
Description
在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。
Input
第一行是两个整数N和S,其中N是树的节点数。 第二行是N个正整数,第i个整数表示节点i的正整数。 接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
Output
输出路径节点总和为S的路径数量。
Range
对于100%数据,N<=100000,所有权值以及S都不超过1000。
Solution
转化一下题意,就是求树上的一条链,使权值之和等于s。
我们可以利用dfs求出树上每个点到根的权值和(也就是树上的前缀和),在回溯的过程中求出答案即可。
具体做法是,当我们在搜一个点 i 时,看一眼有没有它的某个祖先 j 使得 qzh[j]-qzh[i]=p
如何找这个祖先呢?我们可以用 STL 中的 set ,在 dfs 的时候将当前点的前缀和插进集合,回溯的时候找集合中是否有值为 p-qzh[now] 的点,如果有,代表它的某个祖先到它即为一条合法路径, ans++,回溯最后记得从集合中 erase 掉 qzh[now] 即可。
Code
#include<set>
#include<cstdio>
#define N 100005
#define int long long
using namespace std;
int ans;
set<int> s;
int head[N];
int is_root[N];
int val[N],qzh[N];
;
struct Edge{
int to,nxt;
}edge[];
void add(int x,int y){
edge[++cnt].to=y;
edge[cnt].nxt=head[x];
head[x]=cnt;
}
void dfs(int now,int fa){
for(int i=head[now];i;i=edge[i].nxt){
if(edge[i].to==fa) continue;
s.insert(qzh[now]);
qzh[edge[i].to]=qzh[now]+val[edge[i].to];
dfs(edge[i].to,now);
int k=qzh[edge[i].to]-p;
if(s.count(k)) ans++;
s.erase(qzh[edge[i].to]);
}
}
signed main(){
scanf("%lld%lld",&n,&p);
;i<=n;i++) scanf("%lld",&val[i]);
;i<n;i++){
scanf("%lld%lld",&x,&y);
add(x,y);add(y,x);
}
s.insert();
qzh[]=val[];
dfs(,);
printf("%lld",ans);
;
}
[JLOI2012] 树的更多相关文章
- BZOJ2783: [JLOI2012]树 dfs+set
2783: [JLOI2012]树 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 588 Solved: 347 Description 数列 提交文 ...
- 2783: [JLOI2012]树( dfs + BST )
直接DFS, 然后用set维护一下就好了.... O(nlogn) ------------------------------------------------------------------ ...
- 【BZOJ2783】[JLOI2012]树 DFS+栈+队列
[BZOJ2783][JLOI2012]树 Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节 ...
- 题解 P3252 【[JLOI2012]树】
\(\Huge{[JLOI2012]树}\) 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点 ...
- 洛谷——P3252 [JLOI2012]树
P3252 [JLOI2012]树 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度 ...
- 洛谷 P3252 [JLOI2012]树
P3252 [JLOI2012]树 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度 ...
- BZOJ2783: [JLOI2012]树
Description 数列 提交文件:sequence.pas/c/cpp 输入文件:sequence.in 输出文件:sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这 ...
- BZOJ2783: [JLOI2012]树(树上前缀和+set)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1215 Solved: 768[Submit][Status][Discuss] Descriptio ...
- [bzoj2783][JLOI2012]树_树的遍历
树 bzoj2783 JLOI2012 题目大意:给定一棵n个点的树.求满足条件的路径条数.说一个路径是满足条件的,当且仅当这条路径上每个节点深度依次递增且点权和为S. 注释:$1\le n\le 1 ...
- [BZOJ2783/JLOI2012]树 树上倍增
Problem 树 题目大意 给出一棵树,求这个树上的路径的数量,要求路径上的点权和等于s且路径的上每个点深度不同. Solution 这个题目可以用不少方法做. 首先,路径上每个节点的深度不同决定了 ...
随机推荐
- 关系网络理论︱细讲中介中心性(Betweeness Centrality)
关系网络在我认为都是一种很简单暴力地能挖掘人群特征关系的一种方式,特别今天去听了一场关于AI与金融领域的结合,里面提到了拓扑分析其实就是关系网络的解释.我在之前的文章( R语言︱SNA-社会关系网络- ...
- 3.3 与Cache相关的PCI总线事务
PCI总线规范定义了一系列与Cache相关的总线事务,以提高PCI设备与主存储器进行数据交换的效率,即DMA读写的效率.当PCI设备使用DMA方式向存储器进行读写操作时,一定需要经过HOST主桥,而H ...
- 电脑开机后,就会自动运行chkdsk,我想取消chkdsk,怎么取消
每次开机都自动检查磁盘,检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况,即使重装系统,仍可能出现同样情况,但是硬盘可以通过Dell 随机带的检测程序解决方法:在命令行窗口中 ...
- Html细线表格的实现 打印边框设置
在网页制作中,我们常常会使用到表格,表格使得需要表达的信息更清楚,明了. <table border="1" cellspacing="0" border ...
- flask中jinjia2模板引擎使用详解5
接上文 宏 可以理解为函数,即把一些常用的模板片段做好封装,以便于重用,减少工作量和维护难度. 宏的定义很简单: {%macro xxx()%} ##这里写内容 {%endmacro%} 下面引用 ...
- OpenStack_I版 1.准备过程
openstack是一个开源云平台,python开发 此次部署为实验环境, 采用扁平化简单的网络架构部署 优点:低耦合的,模块化 ...
- freemarker之list遍历(八)
1.设置数据源 /** * * @Title:student * @Description: * @param:@param name * @return: void * @throws */ pri ...
- Mac上使用虚拟机搭建Hadoop集群
一. mini安装一台centos到虚拟机上 安装过程参考这篇博客http://www.linuxdown.net/install/setup/2015/0906/4053.html 二. 修改网络配 ...
- docker进阶-初探Docker-compose
什么是Docker-compose compose 翻译成中文的意思是"构成"和"组成"的意思.Docker我之前把他比作一个大轮船,这个轮船上面可以放很多 ...
- 【BZOJ1076】奖励关(动态规划,数学期望)
[BZOJ1076]奖励关(动态规划,数学期望) 题面 懒,粘地址 题解 我也是看了题解才会做 看着数据范围,很容易想到状压 然后,设\(f[i][j]\)表示当前第\(i\)轮,状态为\(j\)的期 ...