bzoj 1316: 树上的询问 (点分治)

1316: 树上的询问

Time Limit: 10 Sec   Memory Limit: 162 MB
Submit: 564   Solved: 150
[ Submit][ Status][ Discuss]

Description

一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No.

Input

第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行三个数x, y, c,表示有一条树边x→y,长度为c. 接下来p行每行一个数Len,表示询问树中是否存在一条长度为Len的路径.

Output

输出有p行,Yes或No.

Sample Input

6 4
1 2 5
1 3 7
1 4 1
3 5 2
3 6 3
1
8
13
14

Sample Output

Yes
Yes
No
Yes


HINT

30%的数据,n≤100. 
100%的数据,n≤10000,p≤100,长度≤1000000. 

做完此题可看下POJ 3237 Tree

Source

[ Submit][ Status][ Discuss]

题解:点分治

#include  
#include  
#include  
#include  
#include  
#define N 30003  
using namespace std;  
int n,m,tot,num[10000003];  
int point[N],next[N],v[N],len[N],cnt,root,sum,vis[N];  
int f[N],deep[N],mp[N],d[N],ak[N],mark[N],son[N],g[N];  
void add(int x,int y,int z)  
{  
    tot++; next[tot]=point[x]; point[x]=tot; v[tot]=y; len[tot]=z;  
    tot++; next[tot]=point[y]; point[y]=tot; v[tot]=x; len[tot]=z;  
    //cout<1&&g[j]*2==ak[i])  
         mark[i]+=opt*num[j]*(num[j]-1);   
       while (l0||!ak[i]) printf("Yes\n");  
     else printf("No\n");  
}  


你可能感兴趣的:(点分治)