Tree

luogu 4178

金牌导航 点分治-1

题目大意

给出一棵树,问你书中路径长度小于等于k的点对个数有多少个

输入样例

5
1 2 3
1 3 1
1 4 2
3 5 1
4

输出样例

8

数据范围

1⩽N⩽4×1041\leqslant N \leqslant 4\times 10^41⩽N⩽4×104

解题思路

对于该树,求出dfs求出重心
对于两点都在同一子树中的点对,分治处理即可
而对于两点不在同一子树的
可以先求出重心到所有点的距离,然后排个序,用双指针得出长度小于k的数量
但是这样得出来的点对可能在同一子树中(图如下)
对于这种情况,我们计算一遍子树的,然后减去就行了(对于在2的同一子树中的情况,2中有出现,1中也有出现,所以2就不用再减子树的点对数了)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 40010
using namespace std;
int n, k, x, y, z, l, r, h, qn, sum, tot, ans, s[N], p[N], q[N], mx[N], size[N], head[N];
struct rec
{int to, l, next;
}a[N<<1];
void add(int x, int y, int z)
{a[++tot].to = y;a[tot].l = z;;a[tot].next = head[x];head[x] = tot;
}
void dfs1(int x)//求重心
{p[x] = 1;size[x] = 1;for (int i = head[x]; i; i = a[i].next)if (!p[a[i].to]){dfs1(a[i].to);size[x] += size[a[i].to];mx[x] = max(mx[x], size[a[i].to]);}p[x] = 0;mx[x] = max(mx[x], sum - size[x]);//还要计算除去x子树后其它点的数量if (mx[x] <= mx[h]) h = x;//求重心return;
}
void dfs2(int x)
{q[++qn] = s[x];//求出到根节点的最短距离p[x] = 1;for (int i = head[x]; i; i = a[i].next)if (!p[a[i].to]){s[a[i].to] = s[x] + a[i].l;dfs2(a[i].to);}p[x] = 0;
}
int count(int x, int y)
{int sum = 0;s[x] = y;qn = 0;dfs2(x);sort(q + 1, q + 1 + qn);l = 1;r = qn;while(l < r){while(q[l] + q[r] > k && l < r) r--;//如果大于k,那么r--sum += r - l;//计算答案l++;//如果l变大了,那r只可能变小}return sum;
}
void solve(int x)
{h = 0;mx[0] = n;dfs1(x);int G = h;ans += count(G, 0);p[G] = 1;for (int i = head[G]; i; i = a[i].next)if (!p[a[i].to]) ans -= count(a[i].to, a[i].l);//减去矛盾的for (int i = head[G]; i; i = a[i].next)if (!p[a[i].to]) sum = size[a[i].to], solve(a[i].to);//分治
}
int main()
{scanf("%d", &n);for (int i = 1; i < n; ++i){scanf("%d%d%d", &x, &y, &z);add(x, y, z);add(y, x, z);       }scanf("%d", &k);sum = n;solve(1);printf("%d", ans);return 0;
}

【点分治】Tree(luogu 4178/金牌导航 点分治-1)相关推荐

  1. 【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)

    正题 luogu 2605 金牌导航 数据结构优化DP-2 题目大意 有若干个村庄在一条直线上,距离第一个村庄did_idi​,在该村庄建立基站要花费cic_ici​,如果在离该村不大于sis_isi ...

  2. 【树链剖分】染色(luogu 2486/金牌导航 树链剖分-3)

    正题 luogu 2486 金牌导航 树链剖分-3 题目大意 给你一棵树,让你进行以下操作: 1.把一条路径染上一个颜色 2.查询一条路径上有多少个颜色段 解题思路 用树链剖分把问题转化为链上问题 然 ...

  3. 【树链剖分】软件管理(luogu 2146/金牌导航 树链剖分-2)

    正题 luogu 2146 金牌导航 树链剖分-2 题目大意 有若干软件,除了软件0,所有软件都依赖且只依赖于另外一个软件 当要删除一个软件时,所有依赖于该软件的软件都要删掉 当安装一个软件时,该软件 ...

  4. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

    正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...

  5. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)

    正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti​时在wiw_iwi​出现(只出现一个单位时间),价值为sis_isi​,当你t ...

  6. 【LCT】城市旅行(luogu 4842/金牌导航 LCT-3)

    正题 luogu 4842 金牌导航 LCT-3 题目大意 给你一棵树,让你进行一些操作: 1.删除一条边 2.连接一条边 3.给一条路径上的点加上x 4.给出一条路径,在该路径选取两个点,求这两个点 ...

  7. 【LCT】弹飞绵羊(luogu 3203/金牌导航 LCT-2)

    正题 luogu 3203 金牌导航 LCT-2 题目大意 给你n个格子,当你在第i个格子时,可以往后跳aia_iai​格,让你进行几下操作: 1.修改第i个数 2.查询在第i个格子跳多少下会跳出界 ...

  8. 【数学】拉格朗日插值(luogu 4781/金牌导航 拉格朗日插值-1)

    拉格朗日插值 luogu 4781 金牌导航 拉格朗日插值-1 题目大意 给出n个点,让你确定经过这n个点且不超过n-1次的方程,现在给出k,让你求出其函数值 样例#1 输入样例#1 3 100 1 ...

  9. 【LCT】洞穴勘测(luogu 2147/金牌导航 LCT-1)

    洞穴勘测 luogu 2147 金牌导航 LCT-1 题目大意 给你若干操作,有三种操作: 1.连接两个点 2.吧两个点之间的连边断掉(保证有这条边) 3.查询两个点之间是否连通 样例 #1 输入样例 ...

最新文章

  1. python缩进在程序中长度统一且强制使用_Python习题纠错1
  2. Flask实战----做了一个简易版CSDN
  3. Swift之深入解析如何将代码添加为自定义LLDB命令
  4. shell脚本命令set
  5. VTK使用矢量数据弯曲几何体
  6. Linux中查询显卡硬件的几种命令(记录)
  7. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演
  8. 【渝粤教育】国家开放大学2018年春季 0704-22T民法基础与实务 参考试题
  9. Python2安装说明
  10. java 实现poi方式读取word文件内容
  11. ai人工智能可以干什么_人工智能可以解决我的业务问题吗?
  12. PandoraBox/LEDE SDK交叉编译OpenWrt ipk安装包的方法
  13. 字符谜题之1:最后的笑声(之所以说是最后的笑声,是因为输出两个Ha,第二个出问题)
  14. 2015秋季腾讯【技术运营】岗位———在线笔试总结
  15. 清歌输入法 for Mac(最好用的五笔输入法
  16. GAL GAME 汉化教程攻略从零开始 1
  17. 数电仿真实验-数字钟的设计
  18. ifc文件转换成obj和mtl文件
  19. 痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间
  20. 一文读懂如何用python调用matlab函数(windows环境)

热门文章

  1. 广东省计算机应用(2010),2010年广东省高等教育自学考试计算机基础及应用(N)试卷(课程代码.doc...
  2. php 自定义菜单 openid,微信公众平台开发(99) 自定义菜单获取OpenID
  3. python笔试题 github_简单的python面试题,居然
  4. zynq网络时钟控制寄存器_ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断...
  5. 435. 无重叠区间(贪心经典题+思路+详解)
  6. [Swagger2]分组和接口注释及小结
  7. 快速排序在最坏的情况下时间复杂度(Ω(nlgn)(算法导论第三版9.3-3))
  8. 递归算法(三)- 回溯法Backtracking
  9. Codeforces Round #682 (Div. 2)D Powerful Ksenia ///思维
  10. BZOJ#3786. 星系探索(平衡树,fhq-treap,弱化版ETT)