P3398 仓鼠找sugar
来源:互联网 发布:c4d r17 mac安装教程 编辑:程序博客网 时间:2024/06/11 21:41
题目描述
小仓鼠的和他的基(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: 复制
5 52 54 21 31 45 1 5 12 2 1 44 1 3 43 1 1 53 5 1 4
输出样例#1: 复制
YNYYY
说明
__本题时限1s,内存限制128M,因新评测机速度较为接近NOIP评测机速度,请注意常数问题带来的影响。__
20%的数据 n<=200,q<=200
40%的数据 n<=2000,q<=2000
70%的数据 n<=50000,q<=50000
100%的数据 n<=100000,q<=100000
求出较深的LCA 是否在另两个点的最短路上
#include<cstdio>#include<algorithm>#define MAXN 100050using namespace std;int n,m;struct node{ int from,to,next;}edge[2*MAXN];int head[MAXN],cnt;int dep[MAXN];int f[MAXN][22];void init(){ for (int j=1;j<=19;j++) { for (int i=1;i<=n;i++) { f[i][j]=f[f[i][j-1]][j-1]; } }}int lca(int x,int y){ int re; if (dep[x]<dep[y]) { swap(x,y); } for (int i=19;i>=0;i--) { if (dep[f[x][i]]>=dep[y]) { x=f[x][i]; } } if (x==y) return x; for (int i=19;i>=0;i--) { if (f[x][i]!=f[y][i]) { x=f[x][i],y=f[y][i]; } else re=f[x][i]; } return re;}void add(int x,int y){ edge[++cnt].from=x; edge[cnt].to=y; edge[cnt].next=head[x]; head[x]=cnt;}void dfs(int x,int fa){ for(int i=head[x];i;i=edge[i].next) { int to=edge[i].to; if (fa==to) continue; dep[to]=dep[x]+1; f[to][0]=x; dfs(to,x); }}inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f;}int main(){ n=read(),m=read(); for (int i=1;i<n;i++) { int x,y; x=read(),y=read(); add(x,y); add(y,x); } f[1][0]=1; dep[1]=1; dfs(1,0); init(); for (int i=1;i<=m;i++) { int x1,y1,x2,y2; x1=read(),y1=read(),x2=read(),y2=read(); int k1=lca(x1,y1),k2=lca(x2,y2); if (dep[k1]==dep[k2]) { if (k1==k2) { printf("Y\n"); } else printf("N\n"); } if (dep[k1]>dep[k2]) { if (lca(k1,x2)==k1||lca(k1,y2)==k1) { printf("Y\n"); } else printf("N\n"); } else if (dep[k1]<dep[k2]) { if (lca(k2,x1)==k2||lca(k2,y1)==k2) { printf("Y\n"); } else printf("N\n"); } } return 0;}
阅读全文
0 0
- P3398 仓鼠找sugar
- 洛谷P3398 仓鼠找sugar
- 洛谷 P3398 仓鼠找sugar
- 洛谷 P3398 仓鼠找sugar
- 洛谷P3398 仓鼠找sugar
- 洛谷P3398 仓鼠找sugar
- 【洛谷 P3398】仓鼠找sugar lca+判断
- Luogu P3398 仓鼠找sugar 倍增LCA
- 仓鼠找sugar II
- LCA——Luogu3398 仓鼠找sugar
- 【Luogu3398】仓鼠找sugar(树链剖分)
- 仓鼠
- Sugar
- 小仓鼠
- 小仓鼠
- rust sugar
- 仓鼠与厕鼠
- 仓鼠有余粮
- js请求解析xml
- 51Nod-1100 斜率最大
- 慕课网——PHP入门篇(语言结构语句)
- MySQL online ddl原理
- 设计模式(22)--策略模式
- P3398 仓鼠找sugar
- div中的内容-图片img垂直居中的五种方法
- 品牌笔记本 品牌台式机 个人组装机 U盘启动快捷热键一览表
- 强制删除文件(1)——直接发IRP到文件系统
- Java初识
- 排序算法(四)堆排序
- 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
- 剑指offer面试题[58]-二叉树的下一个结点
- angular4实现鼠标悬停3d倾斜