Tree

让我们找满足一下五个条件的(x,y(x, y(x,y)点对有多少:

读题目观察到每个节点的valuevaluevalue只有[0,105][0, 10 ^ 5][0,105](如果不是的话,也可离散化处理一下吧),所以我们可以建立10510 ^ 5105棵线段树,每棵线段树里面记录的是点权为iii的节点的深度信息,

所以我们只要做一次dsuontreedsu\ on\ treedsu on tree,动态维护这颗线段树,然后按照需要查询即可,好像并不是特别难。

#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;int head[N], to[N], nex[N], cnt = 1;int value[N], n, m;int son[N], sz[N], dep[N], l[N], r[N], rk[N], tot;int root[N], ls[N << 6], rs[N << 6], sum[N << 6], num;void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs(int rt, int fa) {dep[rt] = dep[fa] + 1, sz[rt] = 1, l[rt] = ++tot, rk[tot] = rt;for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa) {continue;}dfs(to[i], rt);sz[rt] += sz[to[i]];if (!son[rt] || sz[son[rt]] < sz[to[i]]) {son[rt] = to[i];}}r[rt] = tot;
}void push_up(int rt) {sum[rt] = sum[ls[rt]] + sum[rs[rt]];
}void update(int &rt, int l, int r, int x, int value) {if (!rt) {rt = ++num;}if (l == r) {sum[rt] += value;return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, value);}else {update(rs[rt], mid + 1, r, x, value);}push_up(rt);
}int query(int rt, int l, int r, int L, int R) {if (!rt) {return 0;}if (l >= L && r <= R) {return sum[rt];}int mid = l + r >> 1, ans = 0;if (L <= mid) {ans += query(ls[rt], l, mid, L, R);}if (R > mid) {ans += query(rs[rt], mid + 1, r, L, R);}return ans;
}long long ans;void dfs(int rt, int fa, bool keep) {for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa || to[i] == son[rt]) {continue;}dfs(to[i], rt, 0);}if (son[rt]) {dfs(son[rt], rt, 1);}int v = 2 * value[rt], d = dep[rt];for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa || to[i] == son[rt]) {continue;}for (int j = l[to[i]]; j <= r[to[i]]; j++) {int target_v = v - value[rk[j]], last_d = m - (dep[rk[j]] - d);//目标权值,剩下的可延展的距离if (target_v < 0 || last_d <= 0) {//如果目标权值小于0或者剩下的可延展距离没有了,提前剪除不合法continue;}int l = d + 1, r = d + last_d;//深度的区间范围,然后查询即可。ans += query(root[target_v], 1, n,  l, r);}for (int j = l[to[i]]; j <= r[to[i]]; j++) {update(root[value[rk[j]]], 1, n, dep[rk[j]], 1);}}update(root[value[rt]], 1, n, dep[rt], 1);if (!keep) {for (int i = l[rt]; i <= r[rt]; i++) {update(root[value[rk[i]]], 1, n, dep[rk[i]], -1);}}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &value[i]);}for (int i = 2; i <= n; i++) {int x;scanf("%d", &x);add(x, i);}dfs(1, 0);dfs(1, 0, 1);printf("%lld\n", ans * 2);return 0;
}

ICPC 南昌现场赛 K:Tree(dsu on tree + 动态开点线段树)相关推荐

  1. 2019 ICPC Asia Nanchang Regional K.Tree 树上启发式合并 + 动态开点线段树

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,每个点都有一个权值valvalval,求满足以下条件 (1)x!=yx!=yx!=y (2)xxx和yyy不互为祖先 (3)val[lca(x,y ...

  2. 树上启发式合并问题 ---- 2019icpc南昌 K. Tree (树上启发式合并 + 动态开点线段树)

    题目链接 题目大意: 就是给你一颗树,每个点有个权值viv_ivi​,问你有多少对(x,y)(x,y)(x,y)满足: xxx不是yyy的祖先 yyy也不是xxx的祖先 xxx和yyy的距离不超过kk ...

  3. ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)

    题目链接: 题意:在二维平面上有 n 个人,每个人有一个位置(xi, yi)和门派 ci,m 个操作:①改变第 k 个人的位置:②改变第 k 个人的门派:③询问区间[l,r]之间不同门派的两个人的最大 ...

  4. bzoj4605 崂山白花蛇草水(动态开点线段树逃替罪羊重构K-D tree)

    首先我们发现它是一个三维的问题而且还强制在线 囧 我们可以考虑在外面来一个权值线段树,然后每次查询时在线段树二分即可,这样我们每个节点再套一棵K-D tree,用来查询有多少个点被框住了,然后因为是不 ...

  5. 2019 ICPC 南昌网络赛 H. The Nth Item

    2019 ICPC 南昌网络赛 H. The Nth Item 题目大意:已知一个数列F(n): F(0)=0,F(1)=1 F(n)=3∗F(n−1)+2∗F(n−2),(n≥2) ​ 给你一个操作 ...

  6. 2018 icpc 徐州现场赛G-树上差分+组合数学-大佬的代码

    现场赛大佬打印的代码,观摩了一哈. 写了注释,贴一下,好好学习.%%%PKU 代码: 1 //树上差分(LCA) 2 #include<bits/stdc++.h> 3 4 #define ...

  7. 2011 ACM/ICPC 北京现场赛 B HouYi's secret

    周日起床后看见QQ群消息说 bupt上有半同步北京现场赛试题,就进入看了下题,一共读了两个题 A和B(因为这两个题目当时就都提交的很多) A题不会做,有限制的生成树的这类知识好像还没有接触过... B ...

  8. 2019年ACM-ICPC - 南昌网络赛I:Yukino With Subinterval【带修主席树】

    题目: 2019ICPC南昌网络赛I:Yukino With Subinterval 题意: 给定长度为 N 的数组,有两种操作:(1)单点修改,(2)查询区间[qL,qR]内有多少个不同的段(连续相 ...

  9. 【bzoj3065】: 带插入区间K小值 详解——替罪羊套函数式线段树

    不得不说,做过最爽的树套树---- 由于有了区间操作,我们很容易把区间看成一棵平衡树,对他进行插入,那么外面一层就是平衡树了,这就与我们之前所见到的不同了.我们之前所见到的大多数是线段树套平衡树而此题 ...

最新文章

  1. PHP--认识Smarty模板引擎
  2. Spring boot表单重复提交
  3. awgn信道中的噪声功率谱密度_从OFC2020看高级算法在光通信中的应用
  4. Java Web 分页实现
  5. SQL之SELECT语句执行顺序及子句功能
  6. 化学方程式作评、数学上成知识百科……那些“别人家的老师”有何特别?
  7. 飞鸽传书 bbs以及个人主页服务好不热闹
  8. python字符串的10个常用方法总结
  9. bind()的实现(持续更新中)
  10. VS、C#配置R语言开发环境
  11. Java多线程编程模式实战指南一:Active Object模式
  12. 什么是云服务器ECS
  13. 没用东西全部清掉_如何把电脑上无用的东西清理掉,在哪下载
  14. 一个小巧的C++Log输出到文件类
  15. Python中的主函数
  16. 华南师范大学计算机学硕考研,【20计算机考研】二战师兄经验贴,让你少走弯路!...
  17. 当我入门虚拟现实的时候,我学了什么?
  18. 电路复习——电路的等效变换
  19. uipath和python哪个好_如何高效学习Uipath Studio?
  20. python b站自动签到_b站天选微信自动推送

热门文章

  1. linux算法设计,嵌入式Linux平台下随机序列算法设计.doc
  2. 【Tensorflow】解决No module named ‘matplotlib‘/‘pandas‘
  3. 史上最接近上帝的方程!神秘的数字4.669,目前没有人能解开这个谜语......
  4. 月薪5 千~1万的兼职你要不要?不限学历,不限男女!
  5. 用一个小球揭开地球的面纱,探索地球运转的秘密!
  6. 通过R,让你的数据分析更简便!
  7. rabbitmq入门_Rabbit MQ 入门
  8. java io类库,Java利用io类库对各种文件的操作详解
  9. 面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~
  10. c语言环境窗口组成,如何搭建C语言环境