zoukankan      html  css  js  c++  java
  • Codeforces Round #381 (Div. 2)D. Alyona and a tree(树+二分+dfs)

    D. Alyona and a tree

    Problem Description:

    Alyona has a tree with n vertices. The root of the tree is the vertex 1. In each vertex Alyona wrote an positive integer, in the vertex i she wrote ai. Moreover, the girl wrote a positive integer to every edge of the tree (possibly, different integers on different edges).

    Let's define dist(v, u) as the sum of the integers written on the edges of the simple path from v to u.

    The vertex v controls the vertex u (v ≠ u) if and only if u is in the subtree of v and dist(v, u) ≤ au.

    Alyona wants to settle in some vertex. In order to do this, she wants to know for each vertex v what is the number of vertices u such that v controls u.

    Input:

    The first line contains single integer n (1 ≤ n ≤ 2·105).

    The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the integers written in the vertices.

    The next (n - 1) lines contain two integers each. The i-th of these lines contains integers pi and wi (1 ≤ pi ≤ n, 1 ≤ wi ≤ 109) — the parent of the (i + 1)-th vertex in the tree and the number written on the edge between pi and (i + 1).

    It is guaranteed that the given graph is a tree.

    Output:

    Print n integers — the i-th of these numbers should be equal to the number of vertices that the i-th vertex controls.

    Sample Input:

    5
    2 5 1 4 6
    1 7
    1 1
    3 5
    3 6

    Sample Output:

    1 0 1 0 0

    这题是后补的,花了2 3天,最后问了黄菊苣,又看了前几的代码,才有点懂了 但也不错嘛,感受到了D题的难度

    【题目链接】D. Alyona and a tree

    【题目类型】图论+二分+dfs

    &题意:

    一颗树1~n,以1为节点,每个节点i都有一个对应的a[i]值,问每个节点可以控制多少个子节点 并输出
    控制的定义:dis(v,u)<=a[u]
    dis(v,u)的定义:从v到u的边上的权值之和

    &题解:

    首先要存图,下面是前几的大神代码,他用的是g存的图。
    存完图,dfs扫一遍,depth[]存的是权值前缀和,前缀和存在单调性,这时就可以想到用二分了。(构造前缀和,以便用二分)
    --1---
    -2-3--
    --4-5-
    上面是样例的树,假如我dfs到了第4个节点,那么我就二分4 3 1这个路径的前缀和,找到能控制4的最大区间,更新这个区间,之后继续dfs第5个节点,这时修改前缀和的数组,也就是path数组,把4 pop_back掉,把5 push进去,这就可以二分5 3 1这条路了。
    主算法就这样,今天比较晚了,明天写一下试试。

    【时间复杂度】O((nlogn))

    &代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int INF = 2e9;
    typedef long long ll;
    typedef pair<int, int> pii;
    #define fast_io ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    #define freopen(x) freopen(x".in", "r", stdin), freopen (x".out", "w", stdout);
    #define fi first
    #define se second
    #define pb push_back
    #define mp make_pair
    #define sz(x) int(x.size())
    #define all(x) x.begin(), x.end()
    const int N = (int) 1e6;
    vector<pair<ll, int> > path;
    vector<vector<pair<int, ll> > > g(N);
    ll ans[N], a[N], depth[N];
    
    void dfs(int v, int p = -1) {
        ans[v] = 1;
        int idx = lower_bound(all(path), mp(depth[v] - a[v], -1)) - path.begin();
        --idx;
        if (idx >= 0) ans[path[idx].se]--;
        path.pb(mp(depth[v], v));
        for (auto x : g[v]) {
            int to = x.fi;
            if (to == p) continue;
            ll len = x.se;
            depth[to] = depth[v] + len;
            dfs(to, v);
            ans[v] += ans[to];
        }
        path.pop_back();
    }
    int main() {
        fast_io;
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        for (int i = 1; i < n; i++) {
            int p;
            ll w;
            cin >> p >> w;
            g[i + 1].pb(mp(p, w));
            g[p].pb(mp(i + 1, w));
        }
        dfs(1);
        for (int i = 1; i <= n; i++)
            cout << ans[i] - 1 << " ";
        return 0;
    }
    
  • 相关阅读:
    javascript Literal
    [MQ]消息队列产品的功能整理
    [MQ]消息队列与企业服务总线的简单比较,MQ&ESB
    [问题记录.Dotnet]混用不同版本odp组件造成的System.MissingMethodException错误
    [问题记录.Oracle/odp.net]数据库变化通知(Database Change Notification)的使用限制
    .net 中的 json 处理
    负载均衡器/负载均衡硬件简单比较
    [笔记.zipkin]用Docker搭建zipkin-rabbitmq-mysql环境(C#客户端-zipkin4net)
    [问题记录]配置zipkin数据存储到mysql时报错Access denied for user 'root'@'172.17.0.1' (using password: NO)
    [问题记录.Centos7]解决安装teamviewer失败——提示依赖 libQt5WebKitWidgets.so.5()(64bit) >= 5.5
  • 原文地址:https://www.cnblogs.com/s1124yy/p/6103184.html
Copyright © 2011-2022 走看看