题目链接 Alyona and a tree

弄了好几个小时终于Accepted了,之后发现这个题是Div1的。

比较考验我思维的一道好题。

首先,做一遍DFS预处理出t[i][j]和d[i][j]。t[i][j]表示从第i个节点到离他第2^j近的祖先,d[i][j]表示从i开始到t[i][j]的路径上的路径权值总和。

在第一次DFS的同时,对节点x进行定位(结果为dist(x, y)<=a(y))的离x最远的x的某个祖先,然后进行O(1)的差分。

第一次DFS完成后,做第二次DFS统计答案(统计差分后的结果)。时间复杂度为O(NlgN)

代码送上。

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define REP(i,n)                for(int i(0); i <  (n); ++i)
 6 #define rep(i,a,b)              for(int i(a); i <= (b); ++i)
 7 #define dec(i,a,b)              for(int i(a); i >= (b); --i)
 8 #define for_edge(i,x)           for(int i = H[x]; i; i = X[i])
 9
10 #define LL      long long
11 #define ULL     unsigned long long
12 #define MP      make_pair
13 #define PB      push_back
14 #define FI      first
15 #define SE      second
16 #define INF     1 << 30
17 #define sz(x)    (int)x.size()
18
19 const int N     =    200000      +       10;
20 const int M     =    10000       +       10;
21 const int Q     =    1000        +       10;
22 const int A     =    30          +       1;
23
24
25 vector <int> v[N], c[N];
26 LL a[N], deep[N];
27 LL x, y;
28 int n, cnt;
29 LL t[N][A], d[N][A];
30 LL g[N], value[N];
31 LL s[N];
32 LL ans[N];
33
34 void dfs(int x, int fa){
35     if (g[x]){
36         t[x][0] = g[x];
37         d[x][0] = value[x];
38         for (int i = 0; t[t[x][i]][i]; ++i){
39             t[x][i + 1] = t[t[x][i]][i];
40             d[x][i + 1] = d[t[x][i]][i] + d[x][i];
41         }
42         int now = x, noww = 0;
43         bool flag = false;
44         dec(i, 20, 0){
45             if (t[now][i] && d[now][i] + noww <= a[x]){
46                 noww += d[now][i];
47                 now = t[now][i];
48                 flag = true;
49             }
50         }
51         if (flag){
52             --s[g[now]]; ++s[g[x]];
53         }
54     }
55
56     REP(i, sz(v[x])){
57         int u = v[x][i];
58         deep[u] = deep[x] + 1;
59         dfs(u, x);
60     }
61 }
62
63 void dfs2(int x){
64     ans[x] += s[x];
65     REP(i, sz(v[x])){
66         dfs2(v[x][i]);
67         ans[x] += ans[v[x][i]];
68     }
69 }
70
71 int main(){
72
73     scanf("%d", &n);
74     rep(i, 1, n) scanf("%lld", a + i);
75     rep(i, 2, n){
76         scanf("%lld%lld", &x, &y); g[i] = x; value[i] = y;
77         v[x].PB(i), c[x].PB(y);
78     }
79
80     memset(s, 0, sizeof s);
81     cnt = 0;
82     deep[1] = 0;
83     dfs(1, 0);
84     memset(ans, 0, sizeof ans);
85     dfs2(1);
86     rep(i, 1, n - 1) printf("%lld ", ans[i]);
87     printf("%lld\n", ans[n]);
88
89     return 0;
90
91 }

转载于:https://www.cnblogs.com/cxhscst2/p/6352240.html

Codeforces 739B Alyona and a tree (树上路径倍增及差分)相关推荐

  1. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)

    题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...

  2. Alyona and a tree (树上倍增+差分)

    题意: 来源(洛谷翻译 题解: 首先先转化一下问题,题目问当前结点(u)的子树中有多少个孩子(设为v)满足dis(u,v)<=a[v],那么我们可以统计每个结点分别对哪些结点做出了贡献. 首先考 ...

  3. B. Alyona and a tree(dsu on tree + bit)

    B. Alyona and a tree(dsu on tree + bit) 给定一颗以111号节点为根的树,每个点有点权aia_iai​,边有边权,如果vvv控制了点uuu,当且仅当uuu是vvv ...

  4. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  5. 树上路径(path)

    树上路径(path) 题目描述 在Berland,有n个城堡. 每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且间接隶属于国王. ...

  6. 原始Radix Tree与路径压缩

    原始Radix Tree与路径压缩 Radix Tree简介 Radix tree 是一种前缀字典树,它的主要特点是树的高度不随数据库大小和节点数量改变,而是由 key 的长度决定.B树需要根据数据量 ...

  7. CodeForces - 1521D Nastia Plays with a Tree(树上最小路径覆盖)

    题目链接:点击查看 题目大意:给出一棵树,可以删除 xxx 条边并增加 xxx 条边使得树变为竹子,竹子就是一条链,问 xxx 最小可以为多少,输出一种方案数 题目分析:树上最小路径覆盖,按照子节点个 ...

  8. CodeForces - 932D Tree(树上倍增,好题)

    题目链接:点击查看 题目大意:给出一棵树,初始时只有一个节点1,权值为0,后续有 n 个操作,每次操作分为两种情况: 1 u val:向树中插入一个新的节点,其父节点为 u ,权值为 val 2 u ...

  9. CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)

    http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求 ...

最新文章

  1. Spark MLlib之使用Breeze操作矩阵向量
  2. 传播路径可训练的神经网络(云上人二代)
  3. Alamofire源码解读系列(五)之结果封装(Result)
  4. pandas 第一行_Pandas进阶,从0到100你还差这篇文章!
  5. 精通java图片_面试必备:详解Java I/O流,掌握这些就可以说精通了?
  6. Android Studio(7)---从模板添加代码
  7. 间接寻址级别不同_单片机指令系统与寻址方式
  8. 为什么电脑插上网线半天才有网,是路由器的的问题吗?
  9. git21天打卡day11-删除分支
  10. Silverligth API for ArcGIS应用程序IIS发布
  11. linux修改yum本地源的方法
  12. 小小方法,问题锦集。
  13. 次坐标从0开始_干货 | 全站仪测量使用方法及坐标计算,一步一步讲解!
  14. 由国内媒体的“非典”报道看信息生态问题-引文
  15. 关于定时器setTimeout与setInterval的定时与关闭操作
  16. 原生JS写仿淘宝搜索框(代码+效果),可实现3级搜索哦!
  17. “裕同集团易普优APS项目启动大会”顺利召开
  18. 打怪升级之小白的大数据之旅(六十七)<Hive旅程第八站:Hive的函数>
  19. 点云数据详解——点云数据变为图像
  20. 【学习笔记】IP地址块的聚合

热门文章

  1. 葡萄城 SpreadJS 表格控件 V11 产品白皮书
  2. Express 项目结构最佳实践(上)
  3. MarkdownPad基于语法示例
  4. Javascript设计模式之发布-订阅模式
  5. linux压缩命令(二)bzip2总结
  6. 阿里云centos7使用yum安装mysql的正确姿势
  7. 关于iOS原生条形码扫描,你需要注意的两三事
  8. 职场人际关系该如何拿捏
  9. KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3
  10. VS2010 Beta1 / .NET Framework 4 Beta 1 - 下载