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...