P3806 模板 點分治1

2022-09-15 00:42:21 字數 1125 閱讀 1008

p3806 【模板】點分治1

定一棵有 \(n\) 個點的樹,多次詢問樹上距離為 \(k\) 的點對是否存在。

澱粉質模板題。

澱粉質的核心就是其只統計經過當前根結點的路徑,即可以把兩條路徑「拼」起來,同時分治結構保證了其只有 \(log\) 次這樣的計算。

常用於統計樹上點對數量這樣的問題。

來看這道題。

可以對每乙個路徑長度開乙個桶來存有多少條,但是這裡是多次詢問,於是我們每一次要遍歷所有詢問來查詢桶。

具體可以見**:

#includeusing namespace std;

template inline void read(t &x)

template inline void write(t x)

#define ll long long

const int n=1e5+5,m=1e7+5;

int n,m;

int head[n],nex[n],to[n],val[n],idx;

int q[n],path[n],clear[n],siz[n];

int root,nowmax,path_cnt,cnt,size;

inline void add(int u,int v,int w)

void findroot(int x)

max=max(size-siz[x],max);

if(maxvis[x]=false;

return ;

}void getpath(int x,int d)

vis[x]=false;

return ;

}void dfs(int x)

} }for(int i=head[x];i;i=nex[i])

return ;

}signed main()

for(int i=1;i<=m;i++) read(q[i]);

size=n,nowmax=n,root=0,findroot(1),dfs(root);

for(int i=1;i<=m;i++) puts(ans[i]?"aye":"nay");

return 0;

}

P3806 模板 點分治1

給定一棵有 n 個點的樹,詢問樹上距離為 k 的點對是否存在。關於點分治具體內容可以看這個 這裡主要是詳細講講 getrt是用來求重心,我們利用樹型dp的思維來做,即找到該節點所有的子樹,找到最大的哪一顆即可 void getrt int u,int pa 求重心 maxp u max maxp u...

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

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