点分治 poj1741
题意:
给出一颗树,询问有多少对点对距离<=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的更多相关文章
- POJ1741——Tree(树的点分治)
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...
- POJ 1741 Tree (树分治入门)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8554 Accepted: 2545 Description ...
- 模板复习【updating】
马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string. ...
- POJ1741 Tree(树分治——点分治)题解
题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...
- 【POJ1741】Tree(点分治)
[POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...
- POJ1741 Tree + BZOJ1468 Tree 【点分治】
POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive ...
- [bzoj1468][poj1741]Tree_点分治
Tree bzoj-1468 poj-1741 题目大意:给你一颗n个点的树,求树上所有路径边权和不大于m的路径条数. 注释:$1\le n\le 4\cdot 10^4$,$1\le m \le 1 ...
- Cogs 1714. [POJ1741][男人八题]树上的点对(点分治)
[POJ1741][男人八题]树上的点对 ★★★ 输入文件:poj1741_tree.in 输出文件:poj1741_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] ...
- poj1741(入门点分治)
题目链接:https://vjudge.net/problem/POJ-1741 题意:给出一棵树,求出树上距离不超过k的点对数量. 思路:点分治经典题.先找重心作为树根,然后求出子树中所有点到重心的 ...
随机推荐
- 浅谈分词算法(3)基于字的分词方法(HMM)
目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...
- MySQL事物(一)事务隔离级别和事物并发冲突
数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始 ...
- Redis详解(一)冰叔带你了解Redis
Redis 是一种基于 键值对 的 NoSQL 数据库.与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串).hash(哈希).list(列表).set ...
- shell反弹总结
NC反弹 常用的命令: -l 监听模式 -n 指定数字的IP地址 -p port(本地端口) -s addr 本地源地址 -v 详细输出 -i secs 延时的间隔 -e filename ...
- luogu 1314 欧拉回路
欧拉路径:一笔画的路径 欧拉回路:一笔画的回路 两者判断方法一样但是输出略有不同.并且还有Fleury(弗罗莱)算法,但是我不会.. 这里就用dfs就好 判断条件: 1)图的连通性(可用并查集判断) ...
- OpenCV入门(1)- 简介
1.图像的表示 在计算机看来,图像只是一些亮度各异的点,一副M*N的图片可以用M*N的矩阵来表示,矩阵的值表示这个位置上像素的亮度. 一般灰度图用二维矩阵来表示,彩色(多通道)图用三维矩阵表示,大部分 ...
- ElasticSearch学习
官方文档 https://www.elastic.co/cn/ http://www.learnes.net/
- CentOS挂载光盘
mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom umount /dev/cdrom /mnt/cdrom 在Ambari集群中配置192.168.0.210: ...
- 解决Myeclipse启动Spring Boot项目报出莫名异常
有时候明明代码.配置都是正确的,但是一启动却报出莫名其妙的异常. 主要原因是resource包下的xml.yml文件或者其他配置文件路径不正确,解决方法如下: 第一步. 第二步.如果Excluded不 ...
- linux/centos6.5下编译安装python2.7和python3.5.2
centos6.5环境下安装python2.7 解压python源码包 tar -xf Python-2.7.6.tar.xz 进入软件包目录 cd Python-2.7.6 添加配置项 ./conf ...