BZOJ1316 樹上的詢問 點分治

2022-08-14 01:39:16 字數 1644 閱讀 8046

time limit: 10 sec  memory limit: 162 mb

submit: 1017  solved: 287

[submit][status][discuss]

一棵n個點的帶權有根樹,有p個詢問,每次詢問樹中是否存在一條長度為len的路徑,如果是,輸出yes否輸出no.

第一行兩個整數n, p分別表示點的個數和詢問的個數. 接下來n-1行每行三個數x, y, c,表示有一條樹邊x→y,長度為c. 接下來p行每行乙個數len,表示詢問樹中是否存在一條長度為len的路徑.

輸出有p行,yes或no.

6 4

1 2 5

1 3 7

1 4 1

3 5 2

3 6 3

1 8

13 14

yes

yes

no yes

30%的資料,n≤100. 

100%的資料,n≤10000,p≤100,長度≤1000000. 

做完此題可看下poj 3237 tree

1 #include2 #include3 #include4 #include5 #include6 #include7

#define maxn 100000

8using

namespace

std;

9int

n,q;

10int

ask[maxn];

11int

ans[maxn];

12struct

edge e[maxn*2

];15

inthead[maxn],cnt;

16void add(int u,int v,int c)

17int

root;

18int

vis[maxn],size[maxn],sum,f[maxn];

19void findrt(int x,int

fa)

27 f[x]=max(f[x],sum-size[x]);

28if(f[x]x;29}

30int

dis[maxn],t[maxn],tt,tmp,num[maxn];

31int dfs(int x,int fa,int

d) 37}38

void cal(int x,int fl,int

d) 46

for(int i=1;i<=q;i++) 56}

57}5859}60

void work(int

x) 68}69

intmain()

77for(int i=1;i<=q;i++) scanf("

%d",&ask[i]);

78 f[0]=2147483647;sum=n;

79 findrt(1,0

);80

work(root);

81for(int i=1;i<=q;i++)

82if(ans[i]>0||!ask[i]) printf("

yes\n");

83else printf("

no\n");

84 }

view code

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的路徑 ...

BZOJ 1316 樹上的詢問 點分治題解

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