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 #include7view code#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 }
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行每行三...