题意:

给出一颗树,询问有多少对点对距离<=k

链接:

http://poj.org/problem?id=1741

题解:

点分治的模板题

点分治即采用分治思想分而治之

考虑一颗子树内距离<=k的两种情况

1.这两点连线不过根节点、

那么就是这个问题的一个子问题

2.这两点连线过根节点

那么从根节点开始dfs出deep数组

之后只需将deep数组排序,一个指针从head开始,一个指针从tail开始,只需满足dep[x]+dep[y]<=k即为满足的解

但会发现如果两个节点位于同一颗子树中是不能构成的,所以应dfs减去这些答案

**读入要优化

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
#define maxn 110000
#define INF 98937894
int root,n,m,c,dd,e,l,ans,sum,b[maxn],head[maxn],son[maxn],f[maxn],vis[maxn],deep[maxn],d[maxn];
struct re{int a,b,c;}a[maxn*];
void arr(int x,int y,int z)
{
l++;
a[l].a=head[x];
a[l].b=y;
a[l].c=z;
head[x]=l;
}
void getroot(int x,int fa)
{
son[x]=; f[x]=;
int u=head[x];
while (u!=)
{
int v=a[u].b;
if (!(v==fa||vis[v]))
{
getroot(v,x);
son[x]+=son[v];
f[x]=max(f[x],son[v]);
}
u=a[u].a;
}
f[x]=max(f[x],sum-son[x]);
if (f[x]<f[root]) root=x;
}
void getdeep(int x,int fa)
{
deep[++deep[]]=d[x];
int u=head[x];
while (u!=)
{
int v=a[u].b;
if (!(v==fa||vis[v]))
{
d[v]=d[x]+a[u].c;
getdeep(v,x);
}
u=a[u].a;
}
}
int cal(int x,int v)
{
d[x]=v; deep[]=;
getdeep(x,);
sort(deep+,deep+deep[]+);
int l=,r=deep[],sum=;
while (l<r)
{
if (deep[l]+deep[r]<=m) sum+=r-l,l++;
else r--;
}
return sum;
}
void solve(int x)
{
ans+=cal(x,);
vis[x]=;
int u=head[x];
while (u!=)
{
int v=a[u].b;
if (vis[v]!=)
{
ans-=cal(v,a[u].c);
sum=son[v];
root=;
getroot(v,x);
solve(root);
}
u=a[u].a;
}
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
std::ios::sync_with_stdio(false);
cin>>n>>m;
while (n!=)
{
memset(vis,,sizeof(vis));
memset(head,,sizeof(head));
l=ans=root=; f[]=INF;
for (int i=;i<=n-;i++)
{
cin>>c>>dd>>e,arr(c,dd,e),arr(dd,c,e);
}
sum=n;
getroot(,);
solve(root);
cout<<ans<<endl;
cin>>n>>m;
}
return ;
}

点分治 poj1741的更多相关文章

  1. POJ1741——Tree(树的点分治)

    1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...

  2. POJ 1741 Tree (树分治入门)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8554   Accepted: 2545 Description ...

  3. 模板复习【updating】

    马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string. ...

  4. POJ1741 Tree(树分治——点分治)题解

    题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...

  5. 【POJ1741】Tree(点分治)

    [POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...

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

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

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

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

  8. Cogs 1714. [POJ1741][男人八题]树上的点对(点分治)

    [POJ1741][男人八题]树上的点对 ★★★ 输入文件:poj1741_tree.in 输出文件:poj1741_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] ...

  9. poj1741(入门点分治)

    题目链接:https://vjudge.net/problem/POJ-1741 题意:给出一棵树,求出树上距离不超过k的点对数量. 思路:点分治经典题.先找重心作为树根,然后求出子树中所有点到重心的 ...

随机推荐

  1. 〖C语言学习笔记 〗(二) 数据类型

    前言 本文为c语言的学习笔记,很多只是留下来占位的 数据类型 助记:变量就是在内存中挖个坑并给这个坑命名,而数据类型就是挖内存的坑的尺寸 基础类型 整数类型: short int int long i ...

  2. Web版微信协议分析—版本2

    微信web协议分析(微信网页版 wx2.qq.com) 1.打开首页,分配一个随机uuid,2.根据该uuid获取二维码图片.3.微信客户端扫描该图片,在客户端确认登录.4.浏览器不停的调用一个接口, ...

  3. 六、uboot 代码流程分析---start.S

    6.1 _start 入口函数 6.1.1 vectors.S (arch\arm\lib) 从上一节可以知道,uboot 的入口函数为 _start .此 函数定义在 vectors.S (arch ...

  4. 无线DOS攻击

    1.无线连接状态 IEEE 802.11定义了一种客户端状态机制,用于跟踪工作站身份验证和关联状态.无线客户端和AP基于IEEE标准实现这种状态机制.成功关联的客户站停留在状态3,才能进行无线通信.处 ...

  5. MySQL之当数据库数据源被锁(Table Metadata Lock)时的解决方案

    0.发生的原因分析:[hibernate的线程池连接导致了不能修改被锁定数据库的数据库型模式] 1.关掉hibernate的所有线程池(选择退出IDE或者其他办法) 2.查看被锁的进程ID:show ...

  6. luogu P1344 [USACO4.4]追查坏牛奶Pollutant Control

    传送门 要求断掉某些边使得两个点不连通,显然是最小割 但是要求选的边数尽量少,,, 可以考虑修改边权(容量),即把边权\(c\)改成\(c*(m+1)+1\) 没了 // luogu-judger-e ...

  7. layoutSubviews总结(转)

    - (void)setNeedsDisplay - (void)drawRect 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 You shou ...

  8. 关于MySQL 8.0的几个重点【转】

    转自 关于MySQL .0的几个重点,都在这里 https://mp.weixin.qq.com/s/QUpk9uuS2JTli1GT6HuORA 一.关于MySQL Server的改进 1.1 re ...

  9. 设置linux新用户默认当前目录及使用的shell

    切换到root用户,直接修改/etc/passwd文件,找到你的用户名你一行,如下图所示修改路径,然后保存即可.

  10. ajax异步请求302

    我们知道,只有请求成功ajax才会进行回调处理,具体状态码为 status >= 200 && status < 300 || status === 304; 这一点通过查 ...