1316 樹上的詢問(點分治)

2022-04-06 14:01:50 字數 1246 閱讀 8696

鏈結分析

每次查詢出重心(去掉重心後的最大的聯通塊最小,保證複雜度),然後統計過重心的路徑中有沒有長度等於len的。

統計時,由於必須要過重心,不能是同一棵子樹中的。可以挨個遍歷每棵子樹,然後統計即可。

判斷時,用set查詢一下即可。

**

1 #include2 #include3 #include4 #include56

using

namespace

std;78

const

int n = 10010;9

10struct

edge

13 edge(int a,int b,int c)

14 }e[n<<1

];15

inta[n],q[n],ans[n],dis[n],deth[n],head[n],siz[n];

16int tot,root,size,cnt,num =1e9,n,m;

17bool

vis[n];

18set

s;1920 inline int

read()

26void add_edge(int u,int v,int

w) 30

void getroot(int u,int

fa)

40 mx = max(mx,size-siz[u]);

41if (mx < num) root = u,num =mx;

42}

43void dfs(int u,int

fa) 51}

52void calcc(int

u) 67}68

for (int j=1; j<=cnt; ++j) s.insert(a[j]);69}

70}71void solve(int

u) 81}82

intmain()

88for (int i=1; i<=m; ++i)

92 size =n;

93 num =1e9;

94 getroot(1,0

);95

solve(root);

96for (int i=1; i<=m; ++i)

97if (ans[i]) puts("

yes"

);98

else puts("no"

);99

return0;

100 }

BZOJ 1316 樹上的詢問 點分治

time limit 10 sec memory limit 162 mb submit 691 solved 187 submit status discuss 一棵n個點的帶權有根樹,有p個詢問,每次詢問樹中是否存在一條長度為len的路徑,如果是,輸出yes否輸出no.第一行兩個整數n,p分別表...

BZOJ1316 樹上的詢問 點分治

一棵n個點的帶權有根樹,有p個詢問,每次詢問樹中是否存在一條長度為len的路徑,如果是,輸出yes否輸出no.第一行兩個整數n,p分別表示點的個數和詢問的個數 接下來n 1行每行三個數x,y,c,表示有一條樹邊x y,長度為c 接下來p行每行乙個數len,表示詢問樹中是否存在一條長度為len的路徑 ...

BZOJ1316 樹上的詢問 點分治

time limit 10 sec memory limit 162 mb submit 1017 solved 287 submit status discuss 一棵n個點的帶權有根樹,有p個詢問,每次詢問樹中是否存在一條長度為len的路徑,如果是,輸出yes否輸出no.第一行兩個整數n,p分別...