题目链接

题意

给你一棵树,每个节点有一个权值。询问每个节点有多少个点对,满足以该节点为根节点uuu与它的所有子节点vvv,并且∣val[u]−val[v]∣≤K\left|val[u] - val[v] \right|\leq K∣val[u]−val[v]∣≤K

思路

  • 比赛的时候想到一个思路:就是每次从叶子节点向根节点返回,每次把经过的点加入集合,并满足根节点的数量。没时间写了,回来实现一下发现超时,就可能树上有一个长链,在底层有很多叶子节点,这样每次相当于便利了一棵树N2N^2N2的复杂度。
  • 再次向学长请教(学长好厉害啊^ _ ^)。
  • 按照dfsdfsdfs顺序维护一个树状数组,在刚进入节点的时候先计算满足根节点的个数tmptmptmp,然后对子节点进行dfsdfsdfs,在回溯的时候插入当前点再次统计满足根节点的情况sumsumsum,那么sum−tmpsum - tmpsum−tmp就是当前根节点能与子节点形成的点对,同时加上所有子树的和就是当前根节点的答案。
  • 为什么在第一次进入节点的时候统计答案呢?
    刚进入节点的时候,树状数组已经插入了一些节点的值,而这些值并不是当前节点的子节点,所以它不会对节点有贡献。
  • 权值很大需要离散。
#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
using namespace std;
const int maxn = 1e5 + 7;
int tot;
vector<int> g[maxn];
LL a[maxn], b[maxn], c[maxn], ans[maxn], n, k;
void Add(int x) {x++;while (x <= n) {c[x]++;x += lowbit(x);}
}
LL Sum(int x) {x++;LL ans = 0;while (x) {ans += c[x];x -= lowbit(x);}return ans;
}
void dfs(int x) {int l, r;l = lower_bound(b, b + tot, a[x-1]-k) - b - 1;r = upper_bound(b, b + tot, a[x-1]+k) - b - 1;ans[x] -= Sum(r) - Sum(l);LL sum = 0;for (int it : g[x]) {dfs(it);sum += ans[it];}int pos = lower_bound(b, b + tot, a[x-1]) - b;Add(pos);l = lower_bound(b, b + tot, a[x-1]-k) - b - 1;r = upper_bound(b, b + tot, a[x-1]+k) - b - 1;ans[x] += Sum(r) - Sum(l) + sum;return;
}
int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);scanf("%lld %lld", &n, &k);for (int i = 0; i < n; ++i) {scanf("%lld", &a[i]);b[i] = a[i];}sort(b, b + n);tot = unique(b, b + n) - b;for (int i = 2, x; i <= n; ++i) {scanf("%d", &x);g[x].push_back(i);}dfs(1);for (int i = 1; i <= n; ++i) {printf("%lld\n", ans[i]);}return 0;
}

zzuli 2520: 大小接近的点对相关推荐

  1. mysql 默认page大小_MySQL innodb_page_size

    原标题:MySQL innodb_page_size 墨墨导读:Page是MySQL Innodb存储的最基本结构,也是Innodb磁盘管理的最小单位,了解page的一些特性,可以更容易理解MySQL ...

  2. linux文件缓冲大小,确定在Linux中读取文件的最佳缓冲区大小

    我正在编写一个从stdin读取并写入stdout的C程序.但它会缓冲数据,以便仅在读取特定数量的字节后才执行写操作(= SIZE) #include #include #define SIZE 100 ...

  3. Android图片系列-2.Android App图片压缩、裁剪分析整理

    移动端常用的图片格式有PNG和JPEG,目前ios手机和大部分安卓手机拍照生成的图片默认格式都是JPEG.我们开发APP的时候通常使用的是PNG,这可能是考虑到图片质量效果.PNG图片是无损压缩格式, ...

  4. Python3-Cookbook总结 - 第一章:数据结构和算法

    第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. ...

  5. 内存分配器设计的演进

    文章目录 栈内存空间是否够用 系统调用申请内存 最简单的内存分配器实现 -- bump allocator 可扩容的 Bump alloactor 通过free-list 管理的 allocator ...

  6. 序列化和反序列化(转)

    转载:http://kb.cnblogs.com/page/515982/ 摘要 序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出 ...

  7. 快速排序算法(基于Java实现)

    title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...

  8. 详解何恺明团队最新作品:源于Facebook AI的RegNet

    2020-06-18 14:50:24 机器之心转载 来源:计算机视觉研究院 作者:Edison_G 前段时间,何恺明组的研究者提出了一种新的网络设计范式.与以往研究不同,他们没有专注于设计单个网络实 ...

  9. AI 影像诊断平台的5大设计要点

    对于医疗科技的产品经理来说,我们不仅要做好基础的产品设计与规划工作,还要考虑到产品的使用对象,让产品对用户足够友好.并且易懂易操作. 在谈到AI医学影像产品的设计时,在通用的产品设计方式上面我一直认为 ...

最新文章

  1. java版b2b2c社交电商springcloud分布式微服务 (九)服务链路追踪(Spring Cloud Sleuth)...
  2. GridView RowDeleting 动态添加行,删除行记录 不删除数据库中记录
  3. Web前端:11个让你代码整洁的原则
  4. Mac下使用macdeployqt打包qt程序:
  5. Linux操作汇总(常用命令、vim)
  6. 【iOS】Illegal Configuration: The Label outlet from the ViewController to the UILabel is invalid. Outl
  7. 强化学习之DQN(附莫烦代码)
  8. 数字图像处理——相关检测
  9. 利用Audacity软件分析ctf音频隐写
  10. 方波峰峰值和有效值_峰峰值,峰值,平均值,有效值的关系
  11. 基于Gromacs的蜘蛛毒素肽显性溶剂动力学分析
  12. html中px em pt区别介绍
  13. linux管理员最大密码长度,【最新】电信光猫超级管理员账户密码获取方法
  14. 计算机黑屏 风扇转,打开电脑黑屏,但风扇还在转,为什么?
  15. java常用的编辑器之kindeditor
  16. 阿里云云计算ACP实验考试之使用OSS对图片进行基本处理
  17. 诺奖背后的一位女性:伯莎·冯·苏特娜
  18. springboot远程心电诊断系统毕业设计源码091759
  19. 【汇正财经】什么是股票交割方式?股票交割方式有哪些?
  20. 国务院建议探索区块链等技术缩短承兑期限 | 产业区块链发展周报

热门文章

  1. apache 的工作模式
  2. 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解
  3. Swift之深入分析字典的下标访问方法的源码调试和汇编实现
  4. LeetCode 面试题 10.02. 变位词组
  5. 教你用100多行写一个数据库(附源码)
  6. 11.2.2 jQuery选择器
  7. 【Qt】QModbusDevice类
  8. 【Qt】QLayoutItem类
  9. 用计算机弹奏hop,关于职称计算机Photohop模拟练习题参考
  10. mysql数据迁移 脚本_PHP将数据从Oracle向Mysql数据迁移实例