點分治 模板 1

2021-09-26 03:36:49 字數 1871 閱讀 2678

自己整理模板,僅作模板儲存使用

樹上點分治模板** 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...