洛谷 P3806 模板 點分治1

2022-03-20 03:01:54 字數 1203 閱讀 5792

洛谷傳送門

給定一棵有 nn 個點的樹,詢問樹上距離為 kk 的點對是否存在。

第一行兩個數 n,mn,m。

第 22 到第 nn 行,每行三個整數 u, v, wu,v,w,代表樹上存在一條連線 uu 和 vv 邊權為 ww 的路徑。

接下來 mm 行,每行乙個整數 kk,代表一次詢問。

對於每次詢問輸出一行乙個字串代表答案,存在輸出aye,否則輸出nay

看起來像是poi波蘭那邊的題。

算是點分治的模板?

關於點分治的講解,請看:

詳解點分治

**:

#include#include#includeusing namespace std;

#define n 10001

#define re register

inline int read()

while(c>='0'&&c<='9')

return x*f;

}int n,m,query[101];

int cnt=0,mp[n],size[n],root,tot=0,d[n],b[n],a[n];

bool vis[n],ans[101];

int to[n<<1],nxt[n<<1],head[n],val[n<<1];

void add(int a,int b,int c)

void getroot(int x,int fa,int total)

mp[x]=max(mp[x],total-size[x]);

if(!root||mp[x]query[i])

r--;

else if(d[a[l]]+d[a[r]]l++;

else if(b[a[l]]==b[a[r]])

else

} }}

void dfz(int x)

}int main()

for(re int i=1;i<=m;i++)

mp[0]=n;

getroot(1,0,n);

dfz(root);

for(re int i=1;i<=m;i++)

if(ans[i])

puts("aye");

else

puts("nay");

return 0;

}

洛谷 P3806 模板 點分治1

this way 點分治模板 點分治解決的好像大部分是樹上路徑問題 網上模板有很多,我就不贅述了,大致思想就是找到樹的重心,然後o n 地求出路徑經過這個點的所有情況,之後再將樹以這個重心為基準分成多個子樹,再找到他們的重心,如此分治的去做。網上的 各不相同,我找了同集訓隊的人的寫法,用set維護每...

洛谷 P3806 模板 點分治1

感謝hzwer的點分治互測。給定一棵有n個點的樹 詢問樹上距離為k的點對是否存在。輸入格式 n,m 接下來n 1條邊a,b,c描述a到b有一條長度為c的路徑 接下來m行每行詢問乙個k 輸出格式 對於每個k每行輸出乙個答案,存在輸出 aye 否則輸出 nay 不包含引號 輸入樣例 1 複製2 1 1 ...

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

傳送門 點分治!點分治.滾,雖然也沒有可以講的扣就完事了理解好就行 這裡講一下自己計算答案時的乙個部分,我們設tti tt i tti 表示到當前重心的距離為i ii的路徑是否存在 對於每個詢問q iq i qi 因為我們便利完前面的i 1 i 1i 1棵子樹,所以用ttq i itt ttqi i...