题意: 来源(洛谷翻译

题解:
首先先转化一下问题,题目问当前结点(u)的子树中有多少个孩子(设为v)满足dis(u,v)<=a[v],那么我们可以统计每个结点分别对哪些结点做出了贡献。
首先考虑暴力的解法,枚举每个点,针对于每一个结点,不断的去往上找他的父亲结点,并且在找的过程中给每个结点+1的权值,直到找到的结点跟当前结点的距离大于当前结点为止。这样的时间复杂度最差是n^2。
我们发现一步一步的往上找,显然很暴力,对于这种题目,我们可以用类似于二分的方法去查找,那也就是倍增了,显然我们可以快速找到那个临界的结点,但是他们之间的该如何标记呢,我们用差分给他打两个标记即可!
然后最后遍历一遍树处理一下差分即可。

代码:

#pragma GCC optimize(3 , "Ofast" , "inline")
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int maxn = 6e5+10;
int mod=1e9+7;int n;
int a[maxn];
vector<pair<int,int> > edge[maxn];int dep[maxn],dis[maxn];
int f[maxn][25];
void dfs(int x,int w,int fa){f[x][0]=fa;dep[x]=dep[x]+1;dis[x]=dis[fa]+w;for(int i=1;i<=20;i++){f[x][i]=f[f[x][i-1]][i-1];}for(auto i:edge[x]){dfs(i.first,i.second,x);}
}
int b[maxn];void sol(int now){int x=now;for(int i=20;i>=0;i--){if(f[x][i]&&dis[now]-dis[f[x][i]]<=a[now]){x=f[x][i];}}b[f[x][0]]--;b[f[now][0]]++;
}void DFS(int x){for(auto i:edge[x]){DFS(i.first);b[x]+=b[i.first];}
}signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=2;i<=n;i++){int x,y;cin>>x>>y;edge[x].push_back({i,y});}dfs(1,0,0);for(int i=2;i<=n;i++){sol(i);}DFS(1);for(int i=1;i<=n;i++){cout<<b[i]<<" ";}
}

Alyona and a tree (树上倍增+差分)相关推荐

  1. Codeforces 739B Alyona and a tree (树上路径倍增及差分)

    题目链接 Alyona and a tree 弄了好几个小时终于Accepted了,之后发现这个题是Div1的. 比较考验我思维的一道好题. 首先,做一遍DFS预处理出t[i][j]和d[i][j]. ...

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

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

  3. Distance on the tree(树上倍增+主席树+树上差分+lca)南昌网络赛

    题目链接:南昌邀请赛网络赛Distance on the tree 统计一条链上边权小于k的边数. 树上差分,对于边权来说,一条链上的边的条数=sum[x]+sum[y]-2*sum[lca(x,y) ...

  4. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  5. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  6. 主席树 + 树上倍增 ---- codeforces 587C[树上倍增或者主席树]

    题目链接 给定一棵n个点的树,给定m个人(m≤n)在哪个点上的信息,每个点可以有任意个人:然后给q个询问,每次问u到v上的路径有的点上编号最小的k(k≤10)个人(没有那么多人就该有多少人输出多少人) ...

  7. BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)

    1977: [BeiJing2010组队] 次小生成树 Tree Time Limit: 10 Sec Memory Limit: 512 MB Description 小 C 最近学了很多最小生成树 ...

  8. LCA 最近公共祖先(RMQ、树上倍增、Tarjan),树上两点距离,线段重合长度

    对于LCA的一些理解 RMQ dfs处理树 对于一个树形结构,可以用dfs将一颗树转化成数组,数组中记录每个点的标号,这样数组就按照dfs的顺序把树存了下来 确定祖先的范围 对于询问的节点X和Y, X ...

  9. 2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)

    题目链接:点击查看 题目分析:刚看到这个题目的时候,口胡了一个假算法,觉得对于每次询问的操作 [l,r][l,r][l,r] ,只需要找到指令集区间 [l,r][l,r][l,r] 内覆盖到点 kkk ...

最新文章

  1. 2018-8-22-粒子滤波
  2. python【Matlibplot绘图库】-主要概念
  3. python中处理日期和时间的标准模块是-Python time模块参考手册
  4. CSS之两栏固定布局(一)
  5. 图像处理 --- 4.1 图像增强的点运算
  6. 以后的blog将转移到微信公众号,请扫码关注谢谢!
  7. 工程实践:基于C/C++的学生账目管理系统(个人账本管理系统)
  8. 数字图像处理 调色板图像
  9. Pyppeteer使用代理IP(需要权限验证)
  10. 指数型基金基本信息 API 数据接口
  11. Template.js
  12. SDCC编译器 + VSCode开发 8位微控制器
  13. SpringCloud微服务架构学习
  14. 【Flutter从入门到实战】⑪、豆瓣案例-1、星星评分Widget、虚线Widget、TabbarWidget、BottomNavigationBarItem的封装、初始化配置抽取
  15. CheatMaker教学进阶之一 - 基地址与指针
  16. 掌握“盘带技术”——比较磁盘存储和磁带存储
  17. Kafka Broker
  18. HNOI 2018 游记
  19. struts2 common-fileupload上传文件大小限制 - hanxin830311 - JavaEye技术网站
  20. 【计算机组成原理】CPU如何区分指令和数据

热门文章

  1. Linux:命令执行控制与||
  2. 知识蒸馏:如何用一个神经网络训练另一个神经网络
  3. 我靠这份无人机完全指南吹了一整年牛!
  4. 基础知识——if语句和字典(四)
  5. 链表问题10——两个单链表生成相加链表(方法二)
  6. 智能家居隐私问题再遭热议:涉案设备中的数据究竟受不受保护?
  7. 洛谷2014选课(树型dp)
  8. CSS粘住固定底部的5种方法
  9. 浅谈Android系统开发中LOG的使用【转】
  10. has been modified since the precompiled header