luogu P3806 模板 點分治1

2022-10-10 19:39:13 字數 914 閱讀 3313

題面傳送門

發現以前自己寫的像那個一樣。

首先兩次dfs找重心是顯然的。這個可以保證分治複雜度。

然後就可以開個桶直接算即可。

時間複雜度\(o(nmlogn)\)

code:

#include#include#include#include#include#include#include#define i inline

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

#define l(x) x<<1

#define r(x) x<<1|1

#define re register

#define ll long long

#define db double

#define w 10000000

#define n 10000

#define eps (1e-6)

#define mod 1000000007

using namespace std;

int n,m,k[n+5],ans[n+5],x,y,z,f[w+5],dp[n+5],siz[n+5],pus,len,d[n+5],maxn,fl[n+5];

struct yyy;

struct ljb;h[x]=head;}

}s;i void dfs1(int x,int last)

i void dfs2(int x,int last)

i void dfs3(int x,int last)

i void dfs4(int x,int w,int last)

i void dfs(int x)

int main()

luogu P3806 模板 點分治1

題目描述 給定一棵有n個點的樹 詢問樹上距離為k的點對是否存在。多次詢問 可離線 我們先隨意指定乙個虛擬根root,將這棵樹轉化成無根樹 樹上的路徑可以分為兩類,1.經過根節點u的路徑 2.完全在u子樹裡 不經過u 的 對於1,用dis表示當前結點到根節點root的路徑長度,則root的子樹中兩個節...

Luogu P3806 模板 點分治1

給定一棵有 n nn 個點,邊權的樹,回答 m mm 個詢問,每次詢問樹上距離為 k kk 的點對是否存在。資料範圍n 1 04,m 100,邊權 10000,k 107 n leqslant 10 4,m leqslant 100,texttt leqslant 10000,k leqslant ...

luogu P3806 模板 點分治1

給你一棵樹,路徑有長度,多次詢問,每次給出 k,問你是否存在路徑長度為 k 的點對。這道題我們用分治的方法。那我們假設要解決乙個樹,那我們先選重心作為根節點 為了減少高度節省時間 然後就分成兩種討論,一種是路徑都在同乙個子樹中,那這個我們就可以把問題轉換為解決這個子樹。另一種就是在兩個不同的子樹中 ...