BZOJ - 2783 树
第一行是两个整数N和S,其中N是树的节点数。
第二行是N个正整数,第i个整数表示节点i的正整数。
接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
输出格式:
输出路径节点总和为S的路径数量。
输入样例: |
输出样例: |
3 3 1 2 3 1 2 1 3 |
2 |
数据范围:
对于30%数据,N≤100;
对于60%数据,N≤1000;
对于100%数据,N≤100000,所有权值以及S都不超过1000。
这个是JLOI2012的T1,发出来仅为了试题完整
=============================================================================================
在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。
Input
第一行是两个整数N和S,其中N是树的节点数。
第二行是N个正整数,第i个整数表示节点i的正整数。
接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
Output
输出路径节点总和为S的路径数量。
Sample Input
3 31 2 31 21 3
Sample Output
2
Hint
对于100%数据,N≤100000,所有权值以及S都不超过1000。
题解:
这个题目看上去是不是要点分,稍微看一下数据范围,S不超过1000,而且所有点权都为正整数,这意味着我们每次枚举一个起点,dfs,层数不会超过1000层,而且因为要保证深度关系,很多节点都远远达不到。这题还是很暴力吧。
代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> #define MAXN 101000 using namespace std; int ans=0; int val[MAXN],b[MAXN],dep[MAXN],roof; struct edge{int first;int next;int to; }a[MAXN*2]; int n,m,num=0;void addedge(int from,int to){a[++num].to=to;a[num].next=a[from].first;a[from].first=num; }void dfs(int now,int fa,int tot){if(tot==m) ans++;if(tot>=m) return;for(int i=a[now].first;i;i=a[i].next){int to=a[i].to;if(to==fa) continue;if(dep[to]<=dep[now]) continue;dfs(to,now,val[to]+tot);} }void pre(int now,int fa){dep[now]=dep[fa]+1;for(int i=a[now].first;i;i=a[i].next){int to=a[i].to;if(to==fa) continue;pre(to,now);} }int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&val[i]);for(int i=1;i<=n-1;i++){int x,y;scanf("%d%d",&x,&y);addedge(x,y),addedge(y,x);b[y]=1;}for(int i=1;i<=n;i++) if(!b[i]) roof=i;pre(roof,0);for(int i=1;i<=n;i++) dfs(i,0,val[i]);printf("%d",ans);return 0; }
转载于:https://www.cnblogs.com/renjianshige/p/7616763.html
BZOJ - 2783 树相关推荐
- BZOJ 2282 树的直径
SDOI2011的Dayx第2题 题意: 在树中找到一条权值和不超过S的链(为什么是链呢,因为题目中提到"使得路径的两端都是城市",如果不是链那不就不止两端了吗--怎么这么机智的感 ...
- BZOJ 4551树题解
好吧,洛谷的数据比较水暴力就可以过....(而且跑到飞快) 不过(BZ水不过去)还是讲讲正规的做法. 其实一眼可以看出可以树剖,但是,码起来有点麻烦. 其实有一种更简单的离线做法. 我们很容易联想到并 ...
- BZOJ 4811 树链剖分+线段树
思路: 感觉这题也可神了.. (还是我太弱) 首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树 修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到 ...
- bzoj 1036 树的统计Count
题意:... 解法:树链剖分,对点进行重编号,这样的话线段树中点的信息就是树中点的信息...别的很常规... 1 #include<cstdio> 2 #include<cstrin ...
- bzoj 4196 树链剖分 模板
[Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2135 Solved: 1232 [Submit][Status] ...
- BZOJ 2243 树链剖分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 题意:中文题目 思路:树链剖分.首先考虑求区间颜色段数的问题, 我们可以用线段树维护 ...
- bzoj 4337 树的同构
4337: BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树 ...
- Codevs 2460 == BZOJ 1036 树的统计
2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...
- BZOJ 2836 树链剖分+线段树
思路: 链剖+线段树裸题 重链的标号就是DFS序 所以查子树的时候每回就 query(change[x],change[x]+size[x]-1) 就好了 剩下的应该都会吧.. //By Sirius ...
- BZOJ.3257.树的难题(树形DP)
题目链接 状态只与黑.白两点的颜色有关,于是用 \(f[x][i][j]\)表示当前以x为根节点,有\(i\)个黑点\(j\)个白点,使得x子树满足该条件的最小花费. 最后答案就是 \(min\{f[ ...
最新文章
- R语言双因素方差分析
- “我的开源项目被威胁了!”
- 解放你内心的自然领袖,从你的内心而非你的自我来领导你自己
- spring的@Transactional注解详细用法
- Android 读取assets文件下的txt文件
- c语言socket发送excel,socket文件传输功能的实现
- 代码生成平台Xxl-Code-Generator
- python多进程优化for循环_Python中for循环中的多进程处理和传递多个参数
- 3.3_number_join_数字拼接问题
- 超详细|一篇搞定操作系统——处理器管理
- 开箱即用的SSH攻击字典收集工具
- 达梦数据库(DM7试用版)安装
- IC基础知识7-数据选择器
- [贪心][区间dp]Zero-One Codeforces1733D1D2
- XUL透明异形旋转窗体
- 第二模块 商务电子邮件写作技巧
- linux关触摸屏命令,Linux 禁用触摸屏 触摸板
- 三万字,100题!Linux知识汇总!
- Vscode c与c++编译环境配置(.vscode),看这一篇就够了
- 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
热门文章
- 「LibreOJ β Round #4」多项式 (广义欧拉数论定理)
- java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载
- [原创]Tsys 2.0 beta 官方版无法使用自定义SQ
- Xcode 12 引用缺失包:libstdc++.tbd libstdc++.6.tbd libstdc++.6.0.9.tbd 等
- 使用 RxJava 的正确姿势
- 181106 solution
- mongodb 的安装使用步骤
- [moka同学笔记]WINDOWS中cmd的切换目录cd命令失效
- ASP 读取Word文档内容简单示例
- 【转】nginx禁止访问某个文件和目录(文件夹)