• 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 << " ";
    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,输出一行,为这个数列的最小长度。
     

           第一行是两个整数NS,其中N是树的节点数。

           第二行是N个正整数,第i个整数表示节点i的正整数。

           接下来的N-1行每行是2个整数xy,表示yx的儿子。

    输出格式:

           输出路径节点总和为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

           第一行是两个整数NS,其中N是树的节点数。

           第二行是N个正整数,第i个整数表示节点i的正整数。

           接下来的N-1行每行是2个整数xy,表示yx的儿子。

    Output

     

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

     

     

    Sample Input

    3 3

    1 2 3

    1 2

    1 3

    Sample Output

    2

    HINT

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

    Source

  • 相关阅读:
    perl dbi 控制事务
    READ-COMMITTED 不能进行可重复读和防止幻读
    REPEATABLE-READ 预读
    如何规划农商行商业智能系统中的决策分析系统?
    如何规划农商行商业智能系统中的决策分析系统?
    【MySQL】gap lock 浅析
    REPEATABLE-READ和READ-COMMITTED幻读
    ORA-01555: snapshot too old
    CXF动态客户端调用webservice实例
    mysql 区间锁
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4673585.html
Copyright © 2020-2023  润新知