bzoj 4317: Atm的树 树分治

这是一篇关于解决bzoj 4317题目的博客,主要介绍了如何利用树分治和二分查找的方法来求解在树上寻找距离<=d的点的数量问题。博主提供了AC代码,并指出其时间复杂度为O(Nlog^3N)。
摘要由CSDN通过智能技术生成

        一道比较经典的树分治把。。

       二分答案,然后在按照点分治后得到的重心树中找距离<=d的点的数量即可。时间复杂度O(Nlog^3N)。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1000000000
#define N 30005
#define M 1200005
using namespace std;

int n,k,m,cnt,rt,tot=1,all,pnt[M],edg[M],len[M],nxt[M];
int a[M],f[N],sz[N],pl[N],pr[N],ql[N],qr[N];
struct graph{
	int fst[N];
	void add(int x,int y,int z,int w){
		pnt[++tot]=y; edg[tot]=z; len[tot]=w; nxt[tot]=fst[x]; fst[x]=tot;
	}
}g1,g2;
void get_rt(int x,int fa){
	int p; sz[x]=1; f[x]=0;
	for (p=g1.fst[x]; p; p=nxt[p]) if (edg[p]){
		int y=pnt[p];
		if (y!=fa){
			get_rt(y,x); sz[x]+=sz[y];
			f[x]=max(f[x],sz[y]);
		}
	}
	f[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值