感謝hzwer的點分治互測。
給定一棵有n個點的樹
詢問樹上距離為k的點對是否存在。
輸入格式:
n,m 接下來n-1條邊a,b,c描述a到b有一條長度為c的路徑
接下來m行每行詢問乙個k
輸出格式:
對於每個k每行輸出乙個答案,存在輸出「aye」,否則輸出」nay」(不包含引號)
輸入樣例#1: 複製
2 11 2 2
2
輸出樣例#1: 複製
aye
對於30%的資料n<=100
對於60%的資料n<=1000,m<=50
對於100%的資料n<=10000,m<=100,c<=1000,k<=10000000
#include#include#include
#include
#define maxn 10010
using
namespace
std;
inthead[maxn],d[maxn],num,sum,f[maxn],n,m,tt,pp,root,son[maxn];
struct nodee[maxn*2
];bool
is[10000010
],vis[maxn];
struct nodea[maxn];
void insert(int
from,int to,int
v)void getroot(int x,int
father)
f[x]=max(f[x],sum-son[x]);
if(f[x]x;
}node make_node(
int x,int
y)int getdep(int r1,int r2,int x,int
father)
}void solve(intx)}
intmain()
root=0;sum=f[0]=n;
getroot(
1,0);
solve(root);
while(m--)
return0;
}
洛谷 P3806 模板 點分治1
this way 點分治模板 點分治解決的好像大部分是樹上路徑問題 網上模板有很多,我就不贅述了,大致思想就是找到樹的重心,然後o n 地求出路徑經過這個點的所有情況,之後再將樹以這個重心為基準分成多個子樹,再找到他們的重心,如此分治的去做。網上的 各不相同,我找了同集訓隊的人的寫法,用set維護每...
洛谷 P3806 模板 點分治1
洛谷傳送門 給定一棵有 nn 個點的樹,詢問樹上距離為 kk 的點對是否存在。第一行兩個數 n,mn,m。第 22 到第 nn 行,每行三個整數 u,v,wu,v,w,代表樹上存在一條連線 uu 和 vv 邊權為 ww 的路徑。接下來 mm 行,每行乙個整數 kk,代表一次詢問。對於每次詢問輸出一行...
洛谷 P3806 模板 點分治1 點分治
傳送門 點分治!點分治.滾,雖然也沒有可以講的扣就完事了理解好就行 這裡講一下自己計算答案時的乙個部分,我們設tti tt i tti 表示到當前重心的距離為i ii的路徑是否存在 對於每個詢問q iq i qi 因為我們便利完前面的i 1 i 1i 1棵子樹,所以用ttq i itt ttqi i...