题目链接:bnu52509
     Borrow Classroom
        <label style="font-weight:bold;">Time Limit: </label>5000ms  
      <label style="font-weight:bold;">Memory Limit: </label>262144KB  
               Font Size:   <button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" id="font-plus" style="font-family:'Trebuchet MS', Helvetica, Arial, sans-serif;font-size:1.1em;border-width:1px;border-style:solid;border-color:rgb(204,204,204);font-weight:bold;color:rgb(51,131,187);overflow:visible;" title="+"> + </button>   <button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" id="font-minus" style="font-family:'Trebuchet MS', Helvetica, Arial, sans-serif;font-size:1.1em;border-width:1px;border-style:solid;border-color:rgb(204,204,204);font-weight:bold;color:rgb(51,131,187);overflow:visible;" title="-"> - </button> 
     Type:   <select id="utags" name="utags"><option value="0"> None</option><option value="1"> Graph Theory</option><option value="2">     2-SAT</option><option value="3">     Articulation/Bridge/Biconnected Component</option><option value="4">     Cycles/Topological Sorting/Strongly Connected Component</option><option value="5">     Shortest Path</option><option value="6">         Bellman Ford</option><option value="7">         Dijkstra/Floyd Warshall</option><option value="8">     Euler Trail/Circuit</option><option value="9">     Heavy-Light Decomposition</option><option value="10">     Minimum Spanning Tree</option><option value="11">     Stable Marriage Problem</option><option value="12">     Trees</option><option value="13">     Directed Minimum Spanning Tree</option><option value="14">     Flow/Matching</option><option value="15">         Graph Matching</option><option value="16">             Bipartite Matching</option><option value="17">             Hopcroft–Karp Bipartite Matching</option><option value="18">             Weighted Bipartite Matching/Hungarian Algorithm</option><option value="19">         Flow</option><option value="20">             Max Flow/Min Cut</option><option value="21">             Min Cost Max Flow</option><option value="22"> DFS-like</option><option value="23">     Backtracking with Pruning/Branch and Bound</option><option value="24">     Basic Recursion</option><option value="25">     IDA* Search</option><option value="26">     Parsing/Grammar</option><option value="27">     Breadth First Search/Depth First Search</option><option value="28">     Advanced Search Techniques</option><option value="29">         Binary Search/Bisection</option><option value="30">         Ternary Search</option><option value="31"> Geometry</option><option value="32">     Basic Geometry</option><option value="33">     Computational Geometry</option><option value="34">     Convex Hull</option><option value="35">     Pick's Theorem</option><option value="36"> Game Theory</option><option value="37">     Green Hackenbush/Colon Principle/Fusion Principle</option><option value="38">     Nim</option><option value="39">     Sprague-Grundy Number</option><option value="40"> Matrix</option><option value="41">     Gaussian Elimination</option><option value="42">     Matrix Exponentiation</option><option value="43"> Data Structures</option><option value="44">     Basic Data Structures</option><option value="45">     Binary Indexed Tree</option><option value="46">     Binary Search Tree</option><option value="47">     Hashing</option><option value="48">     Orthogonal Range Search</option><option value="49">     Range Minimum Query/Lowest Common Ancestor</option><option value="50">     Segment Tree/Interval Tree</option><option value="51">     Trie Tree</option><option value="52">     Sorting</option><option value="53">     Disjoint Set</option><option value="54"> String</option><option value="55">     Aho Corasick</option><option value="56">     Knuth-Morris-Pratt</option><option value="57">     Suffix Array/Suffix Tree</option><option value="58"> Math</option><option value="59">     Basic Math</option><option value="60">     Big Integer Arithmetic</option><option value="61">     Number Theory</option><option value="62">         Chinese Remainder Theorem</option><option value="63">         Extended Euclid</option><option value="64">         Inclusion/Exclusion</option><option value="65">         Modular Arithmetic</option><option value="66">     Combinatorics</option><option value="67">         Group Theory/Burnside's lemma</option><option value="68">         Counting</option><option value="69">     Probability/Expected Value</option><option value="70"> Others</option><option value="71">     Tricky</option><option value="72">     Hardest</option><option value="73">     Unusual</option><option value="74">     Brute Force</option><option value="75">     Implementation</option><option value="76">     Constructive Algorithms</option><option value="77">     Two Pointer</option><option value="78">     Bitmask</option><option value="79">     Beginner</option><option value="80">     Discrete Logarithm/Shank's Baby-step Giant-step Algorithm</option><option value="82">     Greedy</option><option value="83">     Divide and Conquer</option><option value="81"> Dynamic Programming</option></select>    <button class="ui-button ui-widget ui-state-default ui-button-icon-only ui-corner-right ui-button-icon" style="font-family:'Trebuchet MS', Helvetica, Arial, sans-serif;font-size:1.1em;border-width:1px;border-style:solid;border-color:rgb(204,204,204);font-weight:bold;color:rgb(51,131,187);overflow:visible;" title="Show All Items" type="button">   </button>   <button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" style="font-family:'Trebuchet MS', Helvetica, Arial, sans-serif;font-size:1.1em;border-width:1px;border-style:solid;border-color:rgb(204,204,204);font-weight:bold;color:rgb(51,131,187);overflow:visible;" type="submit"> Tag it! </button>  
     Input
     Output
      对于每个询问,输出一行,如果何老师能成功拦截则输出"YES"(不含引号),否则输出"NO"(不含引号)。
         Sample Input
     1
7 2
1 2
2 3
3 4
4 7
1 5
1 6
3 5 6
7 5 6
         Sample Output
     Source
     Author
     SK 
     
  题目大意:
  给你一棵树跟节点是1,q次询问,,每次循环给出 三个数 ABC 现在有一个人从B出发到达C再从C出发到达A,另一个人从A出发来拦截他,A,B同时出发,,问能否可以拦截B,当同时到达1时算拦截失败
  
  题目思路:
  
  很好想到的一个是分别求出从B->C->1的路程bc 和 A->1 的路程a  如果 bc<a则一定拦截不了 如果bc>a则一定可以拦截到,,如果bc=a 如果最后从C出发到达1和A不在同一颗子树上则拦截失败,也就是lca(A,C)==1时拦截失败,否则在到达1之前A可以拦截上,,对于求距离我们可以用lca来求
  
  AC代码:
  
   #include<bits/stdc++.h>
using namespace std;
const int maxn = 4e5;
struct nod
{
    int v,w;
    nod(int v,int w):v(v),w(w){}
    nod(){}
};
vector<nod>G[maxn];
int val[maxn],R[maxn],first[maxn],vis[maxn];
int dp[maxn][20];
int n,m,q,tot;
void dfs(int u,int dep)         //将树处理成线性的即每两个节点位于一段连续的区间里
{
    val[++tot] = u,first[u] =tot,R[tot] = dep;
    vis[u] = 1;
    for(int i=0;i<G[u].size();i++)
    {
        int v = G[u][i].v,w = G[u][i].w;
        if(!vis[v])
        {
            dfs(v,dep+1);
            val[++tot] = u,R[tot] = dep;
        }
    }
}
void ST()             //ST预处理
{
    for(int i=1;i<=tot;i++)
        dp[i][0] = i;
    for(int j=1;j<=log(tot)/log(2);j++)
        for(int i=1;i<=tot;i++)
            if(i+(1<<j)-1<=tot)
            {
                int a = dp[i][j-1],b = dp[i+(1<<(j-1))][j-1];
                dp[i][j] = (R[a]<R[b]?a:b);             //保存编号
            }
}
int RMQ(int l,int r)    //求编号
{
    int k=0;
    while((1<<(k+1))<=r-l+1)
        k++;
    int a = dp[l][k],b = dp[r-(1<<k)+1][k];
    return (R[a]<R[b]?a:b);
}
int lca(int u,int v)   //求lca
{
    int x = first[u],y = first[v];
    if(x>y)swap(x,y);
    int res = RMQ(x,y);
    return val[res];    //返回lca
}
int main()
{
    int t;cin>>t;
    while(t--)
    {
        scanf("%d%d",&n,&q);
        tot = 0;
        for(int i=1;i<=n;i++)
            G[i].clear(),vis[i] = 0;
        for(int i=1;i<n;i++)
        {
            int x,y,z;scanf("%d%d",&x,&y);
            G[x].push_back(nod(y,1));
            G[y].push_back(nod(x,1));
        }
        dfs(1,1);
        ST();
        while(q--)
        {
            int a,b,c;scanf("%d%d%d",&a,&b,&c);
            int lbc = lca(b,c);
            int lac = lca(a,c);
            int len1 = R[first[b]]+R[first[c]]*2-R[first[lbc]]*2-R[1];
            int len2 = R[first[a]] - R[1];
            if(len1<len2||len1==len2&&lac==1)printf("NO\n");
            else printf("YES\n");
        }
    }
    return 0;
}