树中点对距离(点分治)

题目

给出一棵带边权的树,问有多少对点的距离<=Len

分析

这是一道点分治的经典题目,可以给点分治的初学者练手。
点分治,顾名思义就是把每个点分开了处理答案。
假设,目前做到了以x为根的子树。
先求出子树中每个点到根的距离\(dis\),对于两个点\(i\)\(j\),如果\(dis_{i}+dis_{j}<=k\),那么\((i,j)\)就是一个合法的点对。
而点对的路径就会有两种:经过x点的和不经过x点的。
显然,不经过x点的一定会再x的儿子的子树中被计算过。所以,我们要减去不经过x点的。
那怎么把不经过x点的减去呢?
用以x为根的子树的\(dis\)值(why?如果用以x的儿子为根的子树的\(dis\),就会有些可以到达x的儿子的却不能到达x的点对,被多减掉),来计算以x的儿子为根的子树中的点对数量,用减去它们就可以了。

记住要找重心

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
using namespace std;
long long dis[12000],next[22000],last[20020],to[20200],n,m,tot,v[20200],d[5000],sum=0,size[20020],mx[20020],f,root,ans;
bool bz[20020];
long long bj(long long x,long long y,long long z)
{next[++tot]=last[x];last[x]=tot;to[tot]=y;v[tot]=z;
}
void findroot(long long x,long long fa)
{mx[x]=0;size[x]=1;for(long long i=last[x];i;i=next[i]){if(to[i]!=fa && (!bz[to[i]])) {findroot(to[i],x);size[x]+=size[to[i]];mx[x]=max(mx[x],size[to[i]]);}}mx[x]=max(mx[x],f-size[x]);if (mx[x]<mx[root]) root=x;return;
}
void q(long long l,long long r)
{long long i=l,j=r,mid=d[(l+r)/2],e;while(i<j){while(dis[d[i]]<dis[mid]) i++;while(dis[d[j]]>dis[mid]) j--;if(i<=j){e=d[i];d[i]=d[j];d[j]=e;i++;j--;}}if(i<r) q(i,r);if(l<j) q(l,j);
}
long long dg1(long long x,long long fa)
{d[++tot]=x;for(long long i=last[x];i;i=next[i]){long long j=to[i];if(fa!=j && (!bz[j])){dis[j]=dis[x]+v[i];dg1(j,x);}}
}
long long getsum()
{q(1,tot);int i=1,j=tot;long long y=0;while(i<j){if(dis[d[i]]+dis[d[j]]-2>m)j--;else{y+=j-i;i++;            } }return y;
}
long long dg(long long x,long long fa)
{bz[x]=true;dis[x]=1;tot=0;dg1(x,fa);ans+=getsum();for(int i=last[x];i;i=next[i]){int j=to[i];if(!bz[j]) {dis[j]=v[i]+1;tot=0;dg1(j,x);ans-=getsum();f=size[j];root=0;findroot(j,x);dg(root,x);}}
}
int main()
{scanf("%lld%lld",&n,&m);for(long long i=1;i<=n-1;i++){long long x,y,z;scanf("%lld%lld%lld",&x,&y,&z);bj(x,y,z);bj(y,x,z);          }mx[0]=maxlongint;f=n;findroot(1,0);dg(root,0);printf("%lld\n",ans);
}

转载于:https://www.cnblogs.com/chen1352/p/9029689.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【a702】贷款利率

Time Limit: 10 second Memory Limit: 2 MB 问题描述 当一个人从银行贷款后&#xff0c;在一段时间内他将不得不每月尝还固定的分期付款。这个问题要求计算机出贷款者向银行支付的利率。假设利率按月累计。 Input 输入文件 仅一行包含三个用空格隔开的正整数。 第一个整数表示…

移动端适配--meta标签玩的是什么

基本一直都在做移动端的开发&#xff0c;rem布局也写了很久&#xff0c;不过对于实现的原理有些模棱两可的盲点&#xff0c;自己总结一下留着以后回顾。 本文分以下几个层面&#xff0c;主打用最最通俗的语言来阐述。 布局小例子viewport作用viewport和移动端适配的关系flexibl…

python-json

demjson.encode(self, obj, nest_level0) &#xff1a;用于将 Python 对象编码成 JSON 字符串。 #!/usr/bin/python import demjsondata [ { a : 1, b : 2, c : 3, d : 4, e : 5 } ]json demjson.encode(data) print json demjson.decode(self, txt) &#xff1a;解码 JSON 数…

计算机基础知识--编码知识

编码回顾 编码转换 Python的bytes类型 编码回顾 在备编码相关的课件时&#xff0c;在知乎上看到一段关于Python编码的回答 这哥们的这段话说的太对了&#xff0c;搞Python不把编码彻底搞明白&#xff0c;总有一天它会猝不及防坑你一把。 不过感觉这哥们的答案并没把编码问题写明…

Linux——安装FTP服务器

1、检查安装vsftpd软件 使用如下命令#rpm -qa |grep vsftpd可以检测出是否安装了vsftpd软件&#xff0c; 如果没有安装&#xff0c;使用YUM命令进行安装。 2、启动服务 使用vsftpd软件&#xff0c;主要包括如下几个命令&#xff1a; 启动ftp命令#service vsftpd start 停止ftp…

测试开发面试准备之Selenium 工作原理

Selenium 经历了两个版本&#xff0c;Selenium 1.0 和 Selenium 2.0&#xff0c;本文仅介绍Selenium2的原理&#xff0c;在Selenium 2.0 主推的是WebDriver,Selenium2又名Selenium Webdriver。 Selenium2简介 Selenium是一个用于Web应用程序测试的工具&#xff0c;支持多平台、…

CodeForces 11D(状压DP 求图中环的个数)

Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no repeated vertices or edges. Input The first line of input contains two integers n and m (1 ≤ n ≤ 19, 0 ≤ m) – respectively the number of vertices an…

vue插槽的使用(slot)

插槽 该页面假设你已经阅读过了组件基础。如果你还对组件不太了解&#xff0c;推荐你先阅读它。 插槽内容 Vue 实现了一套内容分发的 API&#xff0c;这套 API 基于当前的 Web Components 规范草案&#xff0c;将 <slot> 元素作为承载分发内容的出口。 它允许你像这样合成…

图片与二进制流转换

#region//图片转换为二进制流 public void PictureToBinaryStream() { //获取当前程序运行路径 string path Application.StartupPath; //拼接成测试图片路径 string fullPath path "\\images\\test.png"; //初始化类 Bitmap bmp…

仿MIUI弹性列表

前言 最近去小米之家体验了下小米9&#xff0c;发现MIUI有一个挺特别的列表动画效果&#xff0c;在系统上的各种应用上都能见到它的身影。 网上查了下&#xff0c;小米早在几个系统版本前就有这个&#xff0c;网上也有了实现这个效果的控件库。实现方法大同小异&#xff0c;大多…

10、angular的全部api

1、lowercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.lowercase(AbCdEf))}); 2、uppercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.uppercas…

JavaScript快速入门-ECMAScript本地对象(String)

一、String对象 String对象和python中的字符串一样&#xff0c;也有很多方法&#xff0c;这些方法大概分为以下种类&#xff1a; 1、索引和查找 1、charAt() 返回指定位置的字符。 2、charCodeAt() 返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。 …

8、angular的select

1、数据源为数组 x for x in names第一个x代表在下拉框内显示的数据 第二个x指的是在names里数据 <!DOCTYPE html><html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

ZOJ4116 Game on a Graph

给一个含n个点 m条边的连通图 把k个人分成两组 轮流拿掉一条边 当取走一条边后图不再连通 这个队就输了 水题啦 边为n-1时 下一个拿掉边的那个组就输啦 AC代码&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long ll;4 typedef unsigned lon…

集美大学1414班软件工程个人作业2——个人作业2:APP案例分析

一、作业链接 个人作业2&#xff1a;APP案例分析 二、博文要求 通过分析你选中的产品&#xff0c;结合阅读《构建之法》&#xff0c;写一篇随笔&#xff0c;包含下述三个环节的所有要求。 第一部分 调研&#xff0c; 评测 下载软件并使用起来&#xff0c;描述最简单直观的个人第…

全局eslint不生效的处理

react项目里能用上 eslint 的 airbnb 规范真是的&#xff0c;对自己的编码有很好的帮助&#xff0c;不经可以养成良好的代码风格&#xff0c;而且还能检测出 state或者变量 是否 使用过&#xff0c; 然而&#xff0c;所在团队的小伙伴们&#xff0c;却并未使用&#xff0c;或者…

IP通信基础

源端口和目的端口字段--各占2字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。序号字段--占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号转载于:https://www.…

回溯算法 ------回溯算法的几个例子

1.回溯算法的小结 2.回溯算法的几个例子 2.1 ------ 4后问题 搜索空间&#xff1a; 2.2 ------01背包问题 01背包问题的算法设计 01背包问题的实例分析 01背包问题的搜索空间 2.3 ------- 货郎问题 货郎问题实例 货郎问题的搜索空间 最后再来个小结 转载于:https://www.cnb…

Phaserjs V2的state状态解析及技巧

用phaserjs开发了好多游戏了&#xff0c;但是对phaser还是了解不深&#xff0c;只知道怎么去用&#xff0c;今天就特意花点时间研究下phaser的状态管理到底是怎么回事。 首先&#xff0c;new Phaser.Game&#xff0c;以下是Phaser.Game的部分源码&#xff1a; Phaser.Game fun…

JAVA_出神入化学习路线大纲

注&#xff1a;参考GitHub上的项目&#xff08;toBeTopJavaer&#xff09;总结出来 也是自己的目标。 基础篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899066.html 进阶篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899841.html 高级篇&#xff1a;https://www…