一道比较经典的树分治把。。
二分答案,然后在按照点分治后得到的重心树中找距离<=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[