点分治 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的点对数量. 思路:点分治经典题.先找重心作为树根,然后求出子树中所有点到重心的 ...
随机推荐
- xml总结(一 )
一.了解 XML(eXtensive Markup Language)可扩展标记语言. XML是被用来传输和存储数据,焦点是内容,是对html的补充. HTML是将数据进行格式化显示.xml需要自定义 ...
- C# 窗体内有子控件时鼠标检测
public partial class FormPop : Form { public FormPop() { InitializeComponent(); } private void FormP ...
- VMware虚拟机Mac OS X无法调整扩展硬盘大小的解决方案(转)
使用VMware虚拟机搭建的MacOSX,在10.10以上可能会出现无法扩充磁盘大小的问题. 因为很多朋友在初次安装MacOSX的时候都默认选择40G的磁盘大小,结果用了没两天之后就发现磁盘不够用了. ...
- Hibernate添加日志--log4j
需要导入 slf4j-log4j12-1.6.2.jar slf4j-api-1.6.2.jar log4j-1.2.16.jar 三个jar文件 编写properties文件,建议将日志输出级别设置 ...
- .net 读写xml
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- div背景半透明
例子: html: <div class="erp-mask-a" > <div class="erp-mask-cell-a"> he ...
- POJ1236 Network of Schools【强连通】
题意: N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输,问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件 ...
- 为什么用pycharm在同目录下import,pycharm会报错,但是实际可以运行?
问题已经找到了,pycharm不会将当前文件目录自动加入自己的sourse_path.右键make_directory as-->sources path将当前工作的文件夹加入source_pa ...
- Check Box、Radio Button、Combo Box控件使用
Check Box.Radio Button.Combo Box控件使用 使用控件的方法 1.拖动控件到对话框 2. 定义控件对应的变量(值变量或者控件变量) 3.响应控件各种消息 Check Box ...
- 【Python】多线程-线程池使用
1.学习目标 线程池使用 2.编程思路 2.1 代码原理 线程池是预先创建线程的一种技术.线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态,即均为启动,不消耗 ...