点分治 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的点对数量. 思路:点分治经典题.先找重心作为树根,然后求出子树中所有点到重心的 ...
随机推荐
- SQL语句(五)数据的修改
数据的修改 UPDATE 格式 UPDATE 表名 SET 字段名 = 字段值(这个可以是表达式) [WHERE 条件表达式] 关系运算符 (>.<.>=. <=.=.< ...
- ThinkPHP 3.2 支付宝即时到账接口开发
前言: 一.支付流程 构造请求参数 向支付宝网关发送请求 生成支付宝页面 支付宝交易结果 二.构建支付类 1.官方即时到账文档地址: https://doc.open.alipay.com/doc2/ ...
- Python中变量的属性以及判断方法
1.变量的属性 在Python中,创建一个变量会给这个变量分配三种属性: id ,代表该变量在内存中的地址: type,代表该变量的类型: value,该变量的值: x = 10 print(id(x ...
- JAVA 并发编程学习(2)之基本概念
1,是不是线程创建越多越好? 当一个程序创建了大量的线程时,活跃的线程会消耗内存.若可运行的线程数量多于可用处理器的数量,那么有些线程将闲置.大量空闲的线程会占用许多内存,给垃圾回收带来压力,而且大量 ...
- MongoDB服务无法启动,windows提示发生服务特定错误:100
MongoDB服务无法启动,windows提示发生服务特定错误:100 今天搞了下MongoDB,初上手,感觉体验不错! 但是当我想将它安装为windows 服务后,却怎么也启动不了.网上的解决办 ...
- 拿webshell权限方法(一)
概念 Webshell就是以asp,php,jsp或cgi等网页文件形式存在的一种命令执行环境,也可以将其称为一种网页后门. Access数据库拿webshell 首先看是否能找到网站漏洞进行网站的后 ...
- Git Gui基本使用情况
本教程将讲述:gitk的Git Gui的部分常用功能和使用方法,包括:建库.克隆(clone).上传(push).下载(pull - fetch).合并(pull - merge). ———————— ...
- 第16月第23天 atos
1. grep --after-context=2 "Binary Images:" *crash xcrun atos -o zhiniao_adhoc_stg1.app.dSY ...
- IO流总结笔记三
字节流: 抽象基类:InputStream, OutputStream. 字节流可以操作任何数据.注意:字符流使用的数组是字符数组.Char [] chs 字节流使用的数组是字节数组.Byte [ ...
- Synchronized和lock的区别和用法
一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...