题目链接: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;
}