鏈結分析
每次查詢出重心(去掉重心後的最大的聯通塊最小,保證複雜度),然後統計過重心的路徑中有沒有長度等於len的。
統計時,由於必須要過重心,不能是同一棵子樹中的。可以挨個遍歷每棵子樹,然後統計即可。
判斷時,用set查詢一下即可。
**
1 #include2 #include3 #include4 #include56using
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分別...