自己整理模板,僅作模板儲存使用
樹上點分治模板** 1 該模板有一巨大bug 在統計路徑長度為單邊長度時,會出錯
#include
#include
#include
#include
using
namespace std;
#define inf 999999999
int n,m,len=
0,size;
struct node
;node e[
20010];
int first[
10010];
int root,ms,size[
10010
],mson[
10010
],sum[
10000010];
bool v[
10010];
void
buildroad
(int x,
int y,
int z)
void
getroot
(int x,
int fa)
//fa表示x的父親,防止往回搜
if(size-size[x]
>mson[x]
)mson[x]
=size-size[x]
;//size表示當前這整棵樹的大小,那麼size-size[x]就表示不在x的子樹內的節點數量,下面詳解
if(ms>mson[x]
)ms=mson[x]
,root=x;
//ms表示樹的重心的最大子樹的大小(相當於mson[root]),這一步是用來更新樹的重心的,root用來記錄重心
}int t;
int dis[
10010];
int ask[
110]
,ans[
110]
;void
getdis
(int x,
int fa,
int z)
//fa表示x的父親,z表示x到目標點的距離
}struct asdarr[
10010];
int tt;
bool
cmp(
int x,
int y)
void
solve
(int x,
int y,
int id)
//x表示getdis的起始點,y表示x到目標點的距離,id表示這一次統計出來的答案是合理的還是不合理的
if(arr[j]
.x+arr[mid]
.x>ask[i]
)r=mid-1;
else l=mid+1;
}}}}
void
fenzhi
(int x,
int ssize)
//ssize是當前這棵子樹的大小
}int
main()
for(
int i=
1;i<=m;i++
)scanf
("%d"
,&ask[i]);
root=
0;ms=inf;size=n;
getroot(1
,0);
//cout<<"root"(root,n)
;for
(int i=
1;i<=m;i++)if
(ans[i]
>0)
printf
("aye\n");
else
printf
("nay\n");
}
模板 點分治1
感謝hzwer的點分治互測。給定一棵有n個點的樹 詢問樹上距離為k的點對是否存在。輸入格式 n,m 接下來n 1條邊a,b,c描述a到b有一條長度為c的路徑 接下來m行每行詢問乙個k 輸出格式 對於每個k每行輸出乙個答案,存在輸出 aye 否則輸出 nay 不包含引號 點分治裸題。一種優化的暴力,可...
點分治模板
luogu 3806 近些日子學了點分治,當然只是學了個模板。所謂點分治,使用於處理樹上路徑的一種分治手段。因為利用了重心的性質,時間複雜度可以保證呢。所謂演算法流程 選取當前子樹的重心 計算路徑總數,不管路徑是否過當前重心 後面會去重 計算起點和終點在同一顆子樹中的合法路徑 因為這條路徑不是簡單路...
點分治模板
這兩天跟著學了一手樹上點分治模板,然後有一些感悟,決定來寫一發部落格.首先,鑑於鄙人的經驗,如果想要較快速地學習乙個新演算法,肯定還是先看一道經典的例題比較好,所以我們先來一道例題.給你一棵tree,以及這棵樹上邊的距離.問有多少對點它們兩者間的距離小於等於k 輸入格式 n n 40000 接下來n...