https://www.luogu.org/problem/show?pid=3398#sub

题目描述

小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友?

小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧!

输入输出格式

输入格式:

第一行两个正整数n和q,表示这棵树节点的个数和询问的个数。

接下来n-1行,每行两个正整数u和v,表示节点u到节点v之间有一条边。

接下来q行,每行四个正整数a、b、c和d,表示节点编号,也就是一次询问,其意义如上。

输出格式:

对于每个询问,如果有公共点,输出大写字母“Y”;否则输出“N”。

输入输出样例

输入样例#1:

  1. 5 5
  2. 2 5
  3. 4 2
  4. 1 3
  5. 1 4
  6. 5 1 5 1
  7. 2 2 1 4
  8. 4 1 3 4
  9. 3 1 1 5
  10. 3 5 1 4
输出样例#1:

  1. Y
  2. N
  3. Y
  4. Y
  5. Y

说明

本题时限1s,内存限制128M,因新评测机速度较为接近NOIP评测机速度,请注意常数问题带来的影响。

20%的数据 n<=200,q<=200

40%的数据 n<=2000,q<=2000

70%的数据 n<=50000,q<=50000

100%的数据 n<=100000,q<=100000

得到较深的LCA,设为S,如果构成浅的LCA的两点中任意一点与S的LCA==S,那就能相遇

  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. const int N();
  8. vector<int>vec[N];
  9. int n,q,x,y,u,v;
  10. int size[N],deep[N],top[N],dad[N];
  11.  
  12. void DFS(int x)
  13. {
  14. size[x]=; deep[x]=deep[dad[x]]+;
  15. for(int i=;i<vec[x].size();i++)
  16. if(dad[x]!=vec[x][i])
  17. {
  18. dad[vec[x][i]]=x;
  19. DFS(vec[x][i]);
  20. size[x]+=size[vec[x][i]];
  21. }
  22. }
  23.  
  24. void DFS_(int x)
  25. {
  26. int t=; if(!top[x]) top[x]=x;
  27. for(int i=;i<vec[x].size();i++)
  28. if(dad[x]!=vec[x][i]&&size[t]<size[vec[x][i]]) t=vec[x][i];
  29. if(t) top[t]=top[x], DFS_(t);
  30. for(int i=;i<vec[x].size();i++)
  31. if(dad[x]!=vec[x][i]&&t!=vec[x][i]) DFS_(vec[x][i]);
  32. }
  33.  
  34. int LCA(int x,int y)
  35. {
  36. while(top[x]!=top[y])
  37. {
  38. if(deep[top[x]]<deep[top[y]]) swap(x,y);
  39. x=dad[top[x]];
  40. }
  41. if(deep[x]>deep[y]) swap(x,y);
  42. return x;
  43. }
  44.  
  45. int main()
  46. {
  47. scanf("%d%d",&n,&q);
  48. for(int i=;i<n;i++)
  49. {
  50. scanf("%d%d",&x,&y);
  51. vec[x].push_back(y);
  52. vec[y].push_back(x);
  53. }
  54. DFS(); DFS_();
  55. while(q--)
  56. {
  57. scanf("%d%d%d%d",&x,&y,&u,&v);
  58. int s=LCA(x,y),t=LCA(u,v);
  59. if(deep[s]<deep[t]) swap(s,t),swap(x,u),swap(y,v);
  60. if(LCA(s,u)==s||LCA(s,v)==s) printf("Y\n");
  61. else printf("N\n");
  62. }
  63. return ;
  64. }

洛谷——P3398 仓鼠找sugar的更多相关文章

  1. 洛谷 P3398 仓鼠找sugar 解题报告

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  2. 洛谷P3398 仓鼠找sugar [LCA]

    题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  3. 洛谷P3398 仓鼠找sugar

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  4. 洛谷 P3398 仓鼠找sugar —— 树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 树链剖分一下,路径就变成线段树上的几个区间: 两条路径相交就是线段树上有区间相交,所以在相应位置打个标记, ...

  5. 洛谷 P3398 仓鼠找sugar 题解

    每日一题 day44 打卡 Analysis 首先有一个结论:先找 p1=(a,b),p2=(c,d) 的LCA的深度,在与(a,c),(a,d),(b,c),(b,d)中最深的LCA n的深度比较, ...

  6. 洛谷 [P3398] 仓鼠找sugar

    树剖求LCA 我们可以发现,两条路径ab,cd相交,当且仅当 dep[lca(a,b)]>=dep[lca(c,d)]&(lca(lca(a,b),c)==lca(a,b)||lca(l ...

  7. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  8. 洛谷p3398仓鼠找suger题解

    我现在爱死树链剖分了 题目 具体分析的话在洛谷blog里 这里只是想放一下改完之后的代码 多了一个son数组少了一个for 少了找size最大的儿子的for #include <cstdio&g ...

  9. 洛谷 3398 仓鼠找sugar——树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #in ...

随机推荐

  1. java import跨包引用类理解

    当前类要用其他类时,import具体包路径+.+具体的类 import引入的是被引用类的class文件,所以当我们build path第三方jar包时, 要用他们的类,要把jar包add to bui ...

  2. Ubuntu16.04添加源的地址

    打开terminal,输入sudo gedit /etc/apt/sources.list,向该文件中添加源的地址即可,如,可添加如下地址 deb-src http://archive.ubuntu. ...

  3. POJ 1777

    一道好题. 由算术基本定理,知: 那么,对于上式的每个因子值只能是2^M的形式.取第一个式子为例,通过分解因式出(1+p^2)=2^k知,a只能为1. 于是对于p只能是梅森素数.而且每个梅森素数只能出 ...

  4. POI对Excel单元格进行颜色设置

    POI对Excel单元格进行颜色设置 学习了:http://www.myexception.cn/program/1932587.html HSSFWorkbook workbook = new HS ...

  5. [GraphQL] Mutations and Input Types

    Sometimes, you want to resues object type when doing mutation, you can use 'input' type to help: inp ...

  6. sedna载入xml文件

    如果有一个xml文件a.xml.须要把它载入到sedna数据库xml_db里. sedna是通过se_term把xml载入到数据库的.有两种方法: 1.通过se_term的-query參数. se_t ...

  7. 一个关于 UIPickerView 的 bug

    首先,我下描写叙述一下bug的发生情况: 在使用UIPickerView实现选择城市的时候.出现这样一个Bug 1.在iOS 6的系统上 2.Picker的数据上省份一栏选择了"香港&quo ...

  8. 2015.04.15,外语,读书笔记-《Word Power Made Easy》 10 “如何讨论交谈习惯” SESSION 27

    继续学习交谈习惯的单词,本大章节完成. 1. front and back - and uncles ventriloquist,从belly发声(venter, venris + loquor). ...

  9. UVA - 1471 Defense Lines 树状数组/二分

                                  Defense Lines After the last war devastated your country, you - as the ...

  10. h5-列表

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAX4AAAInCAIAAAAQ0aUJAAAgAElEQVR4nOy9eVxb153wnZk+z/t53n ...