洛谷 P3398 仓鼠找sugar 题解
每日一题 day44 打卡
Analysis
首先有一个结论:先找 p1=(a,b),p2=(c,d) 的LCA的深度,在与(a,c),(a,d),(b,c),(b,d)中最深的LCA n的深度比较,如果 n <=p1 & n<=p2 说明两条路径相交(即满足题目要求)。
假设 (b,c) 是最深的LCA n, p1=dep[LCA(a,b)] .
且 n>=p1.
因为是树,所以每个点走到其LCA的路径只有一条。
也就是说,n点在b到p1的路径上,即两条路径相交
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define int long long
- #define maxn 100000+10
- #define rep(i,s,e) for(register int i=s;i<=e;++i)
- #define dwn(i,s,e) for(register int i=s;i>=e;--i)
- using namespace std;
- inline int read()
- {
- int x=,f=;
- char c=getchar();
- while(c<''||c>'') {if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<='') {x=x*+c-''; c=getchar();}
- return f*x;
- }
- inline void write(int x)
- {
- if(x<) {putchar('-'); x=-x;}
- if(x>) write(x/);
- putchar(x%+'');
- }
- int n,q,cnt;
- int dep[maxn],dp[maxn][+];
- int head[*maxn];
- struct node
- {
- int v,nex;
- }edge[*maxn];
- inline int max_four(int a1,int a2,int a3,int a4)
- {
- return max(max(a1,a2),max(a3,a4));
- }
- inline void add(int x,int y)
- {
- edge[++cnt].v=y;
- edge[cnt].nex=head[x];
- head[x]=cnt;
- }
- void init(int from,int father)
- {
- dep[from]=dep[father]+;
- rep(i,,) dp[from][i]=dp[dp[from][i-]][i-];
- for(int i=head[from];i;i=edge[i].nex)
- {
- int to=edge[i].v;
- if(to==father) continue;
- dp[to][]=from;
- init(to,from);
- }
- }
- int LCA(int x,int y)
- {
- if(dep[x]<dep[y]) swap(x,y);
- dwn(i,,)
- {
- if(dep[dp[x][i]]>=dep[y])
- x=dp[x][i];
- if(x==y) return x;
- }
- dwn(i,,)
- {
- if(dp[x][i]!=dp[y][i])
- {
- x=dp[x][i];
- y=dp[y][i];
- }
- }
- return dp[x][];
- }
- signed main()
- {
- n=read();q=read();
- rep(i,,n-)
- {
- int x=read(),y=read();
- add(x,y);
- add(y,x);
- }
- init(,);
- rep(i,,q)
- {
- int a=read(),b=read(),c=read(),d=read();
- int p1=dep[LCA(a,b)],p2=dep[LCA(c,d)];
- int n1=LCA(a,c),n2=LCA(a,d),n3=LCA(b,c),n4=LCA(b,d);
- int com=max_four(dep[n1],dep[n2],dep[n3],dep[n4]);
- if(p1<=com&&p2<=com) printf("Y\n");
- else printf("N\n");
- }
- return ;
- }
请各位大佬斧正(反正我不认识斧正是什么意思)
洛谷 P3398 仓鼠找sugar 题解的更多相关文章
- 洛谷 P3398 仓鼠找sugar 解题报告
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 洛谷P3398 仓鼠找sugar [LCA]
题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- 洛谷p3398仓鼠找suger题解
我现在爱死树链剖分了 题目 具体分析的话在洛谷blog里 这里只是想放一下改完之后的代码 多了一个son数组少了一个for 少了找size最大的儿子的for #include <cstdio&g ...
- 洛谷P3398 仓鼠找sugar
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- 洛谷——P3398 仓鼠找sugar
https://www.luogu.org/problem/show?pid=3398#sub 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴 ...
- 洛谷 P3398 仓鼠找sugar —— 树链剖分
题目:https://www.luogu.org/problemnew/show/P3398 树链剖分一下,路径就变成线段树上的几个区间: 两条路径相交就是线段树上有区间相交,所以在相应位置打个标记, ...
- 洛谷 [P3398] 仓鼠找sugar
树剖求LCA 我们可以发现,两条路径ab,cd相交,当且仅当 dep[lca(a,b)]>=dep[lca(c,d)]&(lca(lca(a,b),c)==lca(a,b)||lca(l ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交
[题解] 题意就是判断树上两条链是否有交.口诀是“判有交,此链有彼祖”.即其中一条链的端点的Lca在另一条链上. 我们设两条链的端点的Lca中深度较大的为L2,对L2与另一条链的两个端点分别求Lca, ...
随机推荐
- 深度学习-DCGAN论文的理解笔记
训练方法DCGAN 的训练方法跟GAN 是一样的,分为以下三步: (1)for k steps:训练D 让式子[logD(x) + log(1 - D(G(z)) (G keeps still)]的值 ...
- rancher部署kubernets集群
docker的安装 先添加docker源 sudo apt update sudo apt install docker.io docker更换国内镜像 1.配置脚本如下: #!/bin/bashca ...
- Linux新装系统简单指南
也许更好的阅读体验 换源 1. 备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 2.更换源 先用\(gedit\)打开文 ...
- Django开发简单博客流程
什么是Django? Django是一个基于python的高级web开发框架 它能够让开发人员进行高效且快速的开发 高度集成(不用自己造轮子), 免费并且开源 当前路径创建工程 django-admi ...
- nacos初探--作为配置中心
什么是nacos Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心).动态配置服务(可以做配置中心).动态 DNS 服务. 官方介绍是这样的: Nac ...
- JDK8源码解析 --- Long 类型
最近都在看JDK8的源码,想把记录下来与大家一起共享,每天 积累一点,每天成长一点.看了装箱Long类型,有好多以前没有注意到或者不知道的内容,慢慢懂得.废话不多说,直接上代码讲解... 1.缓存区L ...
- K8S 中的容器编排和应用编排
众所周知,Kubernetes 是一个容器编排平台,它有非常丰富的原始的 API 来支持容器编排,但是对于用户来说更加关心的是一个应用的编排,包含多容器和服务的组合,管理它们之间的依赖关系,以及如何管 ...
- P2801 教主的魔法 (线段树)
题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...
- sdcard不可执行.
Possibly you placed it on your sdcard -- which is mounted with the noexec flag. You either need to m ...
- QueryDSL-JPA
QueryDSL-JPA QueryDSL简介 官网 1 QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询. 2 Querydsl可以通过一组通用的查询AP ...