zoukankan      html  css  js  c++  java
  • B. Alyona and a tree

    二分+dfs序+前缀和+瞎几把yy

    #include "a.h"
    
    int n;
    aLL a;
    struct edge
    {
      int to, nx, w;
    } e[N << 1];
    arr fi;
    int ce = 1;
    aLL sum, ans;
    aLL vec, up, down, res;
    ll tot = 1;
    ll rs = 0;
    
    inline void add(int u, int v, int w)
    {
      e[++ce] = edge{v, fi[u], w};
      fi[u] = ce;
    }
    
    void dfs(int x)
    {
      if (fi[x] == -1)
      {
        rs = res[x];
        rs += up[x], rs -= down[x];
        ans[x] = rs;
        return;
      }
      for (int i = fi[x]; i != -1; i = e[i].nx)
      {
        int v = e[i].to, w = e[i].w;
        sum[++tot] = sum[tot - 1] + w;
        int p = lower_bound(sum + 1, sum + 1 + tot, sum[tot] - a[v]) - sum;
        if (tot - 1 >= p)
          up[vec[tot - 1]]++, down[vec[p - 1]]++;
        vec[tot] = v;
        dfs(v);
        tot--;
        res[x] += rs;
        rs = 0;
      }
      rs = res[x];
      rs += up[x], rs -= down[x];
      ans[x] = rs;
    }
    
    int main()
    {
      // file("test");
      while (~scanf("%d", &n))
      {
        me(fi, -1);
        For(i, 1, n) sdf(a[i]);
        For(i, 2, n)
        {
          int x, y;
          sdf(x), sdf(y);
          add(x, i, y);
        }
        vec[1] = 1;
        sum[1] = 0;
        dfs(1);
        For(i, 1, n)
            printf("%d ", ans[i]);
      }
      return 0;
    }
  • 相关阅读:
    (六)软件测试分工
    <C++>FILE和fstream
    <C#>序列化
    <C#>多线程
    <C++>面试
    <C#>面试
    <Linux>Linux系统命令
    <Linux>Linux基础知识
    <CAN>汽车诊断基础知识
    <C++>查询
  • 原文地址:https://www.cnblogs.com/planche/p/9503352.html
Copyright © 2011-2022 走看看