傳送門
點分治!!!
點分治....
..滾,雖然也沒有可以講的扣就完事了理解好就行
這裡講一下自己計算答案時的乙個部分,我們設tti
tt_i
tti
表示到當前重心的距離為i
ii的路徑是否存在
對於每個詢問q
iq_i
qi,因為我們便利完前面的i−1
i-1i−
1棵子樹,所以用ttq
i−
itt_
ttqi−
i來判斷在之前的子樹中,有沒有能與當前這個距離為i
ii的路徑拼出長度為q
iq_i
qi的路徑,如果有,那麼答案就是aye
ayeay
e,否則就是nay
nayna
y
#include
#include
#include
#include
#include
#include
#define ll long long
#define lzx wcimu
using namespace std;
inline ll read()
while
(s>=
'0'&&s<=
'9')
return d*f;
}struct nodee[
20005];
ll ls[
20005
],cnt=
0,n=
read()
,m=read()
;void
add(ll x,ll y,ll w)
; ls[x]
=cnt++
;return;}
ll qu[
105]
,maxp[
10005
],size[
10005
],sum,tf[
10005
],root=0;
void
find
(ll u,ll fa)
if(maxp[u]
) root=u;
return;}
ll dis[
10005
],l1,l2,tt[
10000005
],rem[
10005
],bc[
10005
],ff[
105]
;void
get(ll u,ll fa)
return;}
void
calc
(ll u)
for(ll i=
1;i<=l2;i++
) tt[bc[i]]=
0;return;}
void
work
(ll u)
return;}
intmain()
for(ll i=
1;i<=m;i++
) qu[i]
=read()
; maxp[0]
=sum=n;
find(1
,0);
work
(root)
;for
(ll i=
1;i<=m;i++)if
(ff[i]
)printf
("aye\n");
else
printf
("nay\n");
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
感謝hzwer的點分治互測。給定一棵有n個點的樹 詢問樹上距離為k的點對是否存在。輸入格式 n,m 接下來n 1條邊a,b,c描述a到b有一條長度為c的路徑 接下來m行每行詢問乙個k 輸出格式 對於每個k每行輸出乙個答案,存在輸出 aye 否則輸出 nay 不包含引號 輸入樣例 1 複製2 1 1 ...