2783: [JLOI2012]树( dfs + BST )

直接DFS, 然后用set维护一下就好了.... O(nlogn)

--------------------------------------------------------------------------------

#include<bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < n; ++i)

#define clr(x, c) memset(x, c, sizeof(x))

#define foreach(i, x) for(__typeof(x.begin()) i = x.begin(); i != x.end(); i++)

using namespace std;

const int maxn = 100009;

struct edge {

int to;

edge* next;

} E[maxn], *pt = E, *head[maxn];

inline void addedge(int u, int v) {

pt->to = v, pt->next = head[u];

head[u] = pt++;

}

int w[maxn], n, s, root, ans = 0;

bool F[maxn];

set<int> S;

void dfs(int x, int d) {

d += w[x];

if(S.find(d - s) != S.end()) ans++;

S.insert(d);

for(edge* e = head[x]; e; e = e->next)

dfs(e->to, d);

S.erase(d);

}

int main() {

freopen("test.in", "r", stdin);

clr(F, 0), clr(head, 0);

cin >> n >> s;

rep(i, n) scanf("%d", w + i);

rep(i, n - 1) {

int x, y;

scanf("%d%d", &x, &y); x--, y--;

addedge(x, y);

F[y] = true;

}

S.clear(); S.insert(0);

rep(i, n) if(!F[i])

dfs(i, 0);

cout << ans << "\n";

return 0;

}

--------------------------------------------------------------------------------

2783: [JLOI2012]树

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 572  Solved: 342
[Submit][Status][Discuss]

Description

数列

提交文件:sequence.pas/c/cpp

输入文件:sequence.in

输出文件:sequence.out

问题描述:

把一个正整数分成一列连续的正整数之和。这个数列必须包含至少两个正整数。你需要求出这个数列的最小长度。如果这个数列不存在则输出-1。

输入格式:

每行包含一个正整数n。

每个文件包含多行,读入直到文件结束。

输出格式:

对于每个n,输出一行,为这个数列的最小长度。

第一行是两个整数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。

数据范围:

对于所有数据,n≤263

这个是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 3

1 2 3

1 2

1 3

Sample Output

2

HINT

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

Source

时间: 2024-10-13 16:38:36

2783: [JLOI2012]树( dfs + BST )的相关文章

BZOJ 2783 JLOI2012 树 DFS

题目大意:给定一棵有根树,每个节点有权值,求有多少链上的权值和为S,要求链上节点的深度必须单调(即这条链由某个节点出发指向根) DFS一遍,当深搜到一个点时将这个点加入队列,同时队头向后调整,使队列中元素之和<=s,记录ans 当一个点出栈时将队尾删除,同时队头向前调整,使队列中元素之和刚好<=s 这题1s略卡时间...不过我旁边的哥们用nlogn的算法超时700ms过去的0.0 这怎么过去的0.0 误差也太大了吧0.0 #include<cstdio> #include<c

BZOJ2783: [JLOI2012]树 dfs+set

2783: [JLOI2012]树 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 588  Solved: 347 Description 数列 提交文件:sequence.pas/c/cpp 输入文件:sequence.in 输出文件:sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这个数列必须包含至少两个正整数.你需要求出这个数列的最小长度.如果这个数列不存在则输出-1. 输入格式: 每行包含一个正整数n. 每个文件

【BZOJ2783】[JLOI2012]树 DFS+栈+队列

[BZOJ2783][JLOI2012]树 Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不必一定从根节点开始. Input 第一行是两个整数N和S,其中N是树的节点数. 第二行是N个正整数,第i个整数表示节点i的正整数. 接下来的N-1行每行是2个整数x和y,表示y是x的儿子. Output 输出路径节点总和为S的路径数量. Sa

BZOJ 2783 [JLOI2012]树

题解:set就好 #include<iostream> #include<cstdio> #include<map> #include<cstring> using namespace std; const int maxn=100009; int n,k; int root; int w[maxn]; int notroot[maxn]; int ans; int cntedge; int head[maxn]; int to[maxn<<1]

bzoj2783: [JLOI2012]树

2783: [JLOI2012]树 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 447[Submit][Status][Discuss] Description 数列 提交文件:sequence.pas/c/cpp 输入文件:sequence.in 输出文件:sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这个数列必须包含至少两个正整数.你需要求出这个数列的最小长度.如果这个数列不存在则输出-

洛谷 P3252 [JLOI2012]树

P3252 [JLOI2012]树 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不必一定从根节点开始. 输入输出格式 输入格式: 第一行是两个整数N和S,其中N是树的节点数. 第二行是N个正整数,第i个整数表示节点i的正整数. 接下来的N-1行每行是2个整数x和y,表示y是x的儿子. 输出格式: 输出路径节点总和为S的路径数量. 输入输出样例

题解 P3252 【[JLOI2012]树】

\(\Huge{[JLOI2012]树}\) 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不必一定从根节点开始. 输入输出格式 输入格式: 第一行是两个整数N和S,其中N是树的节点数. 第二行是N个正整数,第i个整数表示节点i的正整数. 接下来的N-1行每行是2个整数x和y,表示y是x的儿子. 输出格式: 输出路径节点总和为S的路径数量. 输入

HDU 5692 线段树+dfs序

Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1779    Accepted Submission(s): 427 Problem Description 百度科技园内有n 个零食机,零食机之间通过n−1 条路相互连通.每个零食机都有一个值v ,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充,零食机的价值v

Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB 总提交次数:196   AC次数:65   平均分:58.62 将本题分享到: 查看未格式化的试题   提交   试题讨论 试题来源 2013中国国家集训队第二次作业 问题描述 给定一棵N个节点的树,每个点有一个权值,有M个询问(a,b,c)若a 为1,回答b到c路径上的最小权值,若a为2,回答b到c路径上的最大权值,若a为3,回答b到c路径上的所有权值的