題面傳送門
發現以前自己寫的像那個一樣。
首先兩次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 的點對。這道題我們用分治的方法。那我們假設要解決乙個樹,那我們先選重心作為根節點 為了減少高度節省時間 然後就分成兩種討論,一種是路徑都在同乙個子樹中,那這個我們就可以把問題轉換為解決這個子樹。另一種就是在兩個不同的子樹中 ...