可以说是点分治第一题,之前那道的点分治只是模模糊糊,做完这道题感觉清楚了很多,点分治可以理解为每次树的重心(这样会把数分为若干棵子树,子树大小为log级别),然后统计包含重心的整个子树的值减去各个子树的值,这样算出的就是与这个重心有关的情况的答案,比如这道题,求路径,那么就考虑在重心所在的子树中所有的路径减去不过重心的路径就是过重心的路径了。之前重心没找对...poj时间卡的紧就T了。。

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime> using namespace std; struct Edge
{
int to,next,w;
}e[]; int n,k,cnt,p[],Ans;
int Son[],f[],val[],depth[];
bool visited[]; void Add_edge(const int x,const int y,const int z)
{
e[++cnt].to=y;
e[cnt].next=p[x];
e[cnt].w=z;
p[x]=cnt;
return ;
} void Get_root(const int S,const int fa,const int tot,int & root)
{
Son[S]=,f[S]=;
for(int i=p[S];i;i=e[i].next)
{
if(e[i].to==fa || visited[e[i].to])continue;
Get_root(e[i].to,S,tot,root);
Son[S]+=Son[e[i].to];
f[S]=max(f[S],Son[e[i].to]);
}
f[S]=max(f[S],tot-Son[S]);
if(f[S]<f[root])root=S;
return ;
} void Get_depth(const int S,const int fa)
{
val[++val[]]=depth[S];
for(int i=p[S];i;i=e[i].next)
{
if(e[i].to==fa || visited[e[i].to])continue;
depth[e[i].to]=depth[S]+e[i].w;
Get_depth(e[i].to,S);
}
return ;
} int Calc(const int S,const int w)
{
depth[S]=w,val[]=;
Get_depth(S,);
sort(val+,val+val[]+);
int t=,l,r;
for(l=,r=val[];l<r;)
{
if(val[l]+val[r]<=k)t+=r-l,l++;
else r--;
}
return t;
} void TDC(const int S)
{
Ans+=Calc(S,);
visited[S]=true;
for(int i=p[S];i;i=e[i].next)
{
if(visited[e[i].to])continue;
Ans-=Calc(e[i].to,e[i].w);
int root=;
Get_root(e[i].to,,Son[e[i].to],root);
TDC(root);
}
return ;
} int main()
{
int x,y,z,i,root; while(scanf("%d%d",&n,&k) && n && k)
{
root=,memset(p,,sizeof(p));cnt=;
memset(visited,,sizeof(visited));
Ans=;
for(i=;i<n;++i)
{
scanf("%d%d%d",&x,&y,&z);
Add_edge(x,y,z);
Add_edge(y,x,z);
} f[]=0x3f3f3f3f;
Get_root(,,n,root);
TDC(root); printf("%d\n",Ans);
} return ;
}

[bzoj1468][poj1741]Tree[点分治]的更多相关文章

  1. [bzoj1468][poj1741]Tree_点分治

    Tree bzoj-1468 poj-1741 题目大意:给你一颗n个点的树,求树上所有路径边权和不大于m的路径条数. 注释:$1\le n\le 4\cdot 10^4$,$1\le m \le 1 ...

  2. 【BZOJ-1468】Tree 树分治

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] ...

  3. [POJ1741]Tree(点分治)

    树分治之点分治入门 所谓点分治,就是对于树针对点的分治处理 首先找出重心以保证时间复杂度 然后递归处理所有子树 对于这道题,对于点对(u,v)满足dis(u,v)<=k,分2种情况 路径过当前根 ...

  4. 【BZOJ1468】Tree [点分治]

    Tree Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距 ...

  5. [poj1741]Tree(点分治+容斥原理)

    题意:求树中点对距离<=k的无序点对个数. 解题关键:树上点分治,这个分治并没有传统分治的合并过程,只是分成各个小问题,并将各个小问题的答案相加即可,也就是每层的复杂度并不在合并的过程,是在每层 ...

  6. POJ1741 Tree 树分治模板

    http://poj.org/problem?id=1741   题意:一棵n个点的树,每条边有距离v,求该树中距离小于等于k的点的对数.   dis[y]表示点y到根x的距离,v代表根到子树根的距离 ...

  7. POJ1741 Tree + BZOJ1468 Tree 【点分治】

    POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive ...

  8. 点分治【bzoj1468】 Tree

    点分治[bzoj1468] Tree Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边 ...

  9. BZOJ.1468.Tree(点分治)

    BZOJ1468 POJ1741 题意: 计算树上距离<=K的点对数 我们知道树上一条路径要么经过根节点,要么在同一棵子树中. 于是对一个点x我们可以这样统计: 计算出所有点到它的距离dep[] ...

随机推荐

  1. linux下.a/.so/.la目标库区别

    在linux平台上编译时,常会遇到目标库的疑问,有静态库也有动态库,单个理解都不太难,但是对复杂的工程而言,一旦混合到一起去,对整个工程的理解和调用,将会造成很大困扰,本文就汇总这几种常见编译结果文件 ...

  2. 学学cookie和session

    什么是Cookie? HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器发起请求时被携带并发送到服 ...

  3. [App Store Connect帮助]一、 App Store Connect 使用入门(1)App Store Connect 工作流程

    您使用 App Store Connect 提交并管理您在 App Store 中销售的 App,使用 TestFlight 分发您 App 的 Beta 版本,接受法律协议,输入您的税务和银行业务信 ...

  4. python - 解决 ModuleNotFoundError: No module named 'pip'

    1.pip的版本为 9.0.3  想用 pip install -U pip 更新下包,但是在更新过程中出现了报错,如下所示: 2.然后尝试用pip install pandas包,提示 Module ...

  5. ARM VM安装Linux Diagnostic 2.3扩展

    目前创建的Azure Linux虚拟机默认安装的是LAD 3.0,如果客户有特殊需求,可以通过如下方法安装LAD 2.3 1.在Azure Portal卸载LAD 3.0 2.使用Azure Powe ...

  6. 推荐给Web前端开发人员的一些书籍(从基础到架构阶段)

    有很多人问我说作为一个前端开发人员都需要看一些什么书籍,尤其是刚入门的新手,今天我整理了一下推荐给大家,大佬绕过. HTML+CSS+JavaScript 网页设计 从入门到精通 作为一个前端新手,强 ...

  7. scala函数用法

    直接上代码. package com.test.scala.test object Function { def main(args: Array[String]): Unit = { println ...

  8. 1、Xamarin 环境准备

    一.安装环境 1.安装VS2017 2.安装Xamarin扩展包 3.安装NDK 工具栏中,一个为AVD(模拟器管理)一个为NDK(管理Andoid SDK) 3.1 先打开NDK,在Tools\Op ...

  9. js 翻页

    翻页功能是js很基础的一个算法,且用得很多,所以必须掌握此项技能. 我们要想清楚在实现翻页的过程中需要哪几个步骤: 1.我们首先需要的变量有哪些,必须的有一个存放当前页码的变量nowPage.一个存放 ...

  10. dubbo之连接控制

    连接控制 服务端连接控制 限制服务器端接受的连接不能超过 10 个 1: <dubbo:provider protocol="dubbo" accepts="10& ...