洛谷 P3806 模板 點分治1 點分治

2021-09-25 04:55:20 字數 1838 閱讀 4620

傳送門

點分治!!!

點分治....

..滾,雖然也沒有可以講的扣就完事了理解好就行

這裡講一下自己計算答案時的乙個部分,我們設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 ...