当前位置: 首页 > news >正文

P3398 仓鼠找sugar (一道LCA的裸题)

https://www.luogu.org/problemnew/show/P3398

题意简单概括一下就是求树上两条路径是否相交;

有这样一个性质:

if相交,则必有lca(a,b) 在路径c <-> d 上or lca(c,d) 在路径a <-> b 上;

接下来就是这样一个问题:

怎样判断一个点(x)是否在一条路径(a,b)上

如果满足以下两个条件,则在:

1.dep[x] >= lca(a,b);

2.lca(x,a) == x || lca(x,b) == x

#include <bits/stdc++.h>
#define read read()
#define up(i,l,r) for(register int i = (l);i <= (r);++i)
#define down(i,l,r) for(register int i = (l);i >= (r);i--)
#define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
#define ll long long
using namespace std;
int read
{
    int x = 0, f = 1; char ch = getchar();
    while(ch < 48 || ch > 57) {if(ch == '-')f = -1; ch = getchar();}
    while(ch >=48 && ch <=57) {x = 10 * x + ch - 48;ch = getchar();}
    return x * f; 
}
//-----------------------------------------------------------------
const int N = 100005;
int n,q;

struct edge{
    int v,nxt;
}e[N<<1];int tot,head[N];

void buildtree(int u,int v) {e[++tot] = (edge){v,head[u]}; head[u] = tot;}
//-----------------------------------------------------------------

int dep[N],size[N],top[N],fa[N];
void initdfs(int u){
    dep[u] = dep[fa[u]] + 1;
    size[u] = 1; top[u] = u;
    int hson_id = 0,hson_size = 0;
    traversal_vedge(i)
    {
        int v = e[i].v;
        if(fa[u] == v) continue;
        fa[v] = u;
        initdfs(v);
        size[u] += size[v];
        if(size[v] > hson_size) hson_id = v,hson_size = size[v];
    }
    if(hson_id) top[hson_id] = u;
}
int find(int u){if(top[u] == u) return u;top[u] = find(top[u]); return top[u];}
int lca(int x,int y){
    if(find(x) != find(y)){
        if(dep[top[x]] > dep[top[y]]) return lca(fa[top[x]],y);
        else return lca(x,fa[top[y]]);
    }
    return dep[x] > dep[y] ? y : x;
}
//-----------------------------------------------------------------
bool ok;
void query(int x,int a,int b){
    if(lca(a,x) == x || lca(b,x) == x) ok = 1;
}

void work(){
    initdfs(1);
    while(q--)
    {
        ok = 0;
        int a = read,b = read,c = read,d = read;
        int x = lca(a,b);int y = lca(c,d);//debug y = lca(a,b)
        if(dep[x] >= dep[y]) query(x,c,d);
        if(!ok) if(dep[y] >= dep[x]) query(y,a,b);
        if(ok == 1) printf("Y\n");
         else printf("N\n");
     }
} 

void readdata(){
    n = read; q = read;
    up(i,1,n-1)
    {
        int u = read,v = read;
        buildtree(u,v);
        buildtree(v,u);
    }    
}

int main()
{
    readdata();
    work();
    return 0;
}

 

转载于:https://www.cnblogs.com/mzg1805/p/10418921.html

相关文章:

  • 创建一个 Django 项目
  • GitHub如何下载clone指定的tag
  • 技术面试感觉什么都会,面试官一问回答不上来怎么办?
  • 性能测试总结(二)---测试流程篇(转载)
  • servlet,javabean,客户端跳转和服务端跳转。
  • 启动从Windows Server 2016发布的应用程序时,黑屏在应用程序可见之前出现几秒钟...
  • 如何自己制作iconfont
  • URL与URI的不同
  • Dubbo 安装监控中心
  • 实习面试笔记
  • spring-boot List转Page
  • Python 之网络式编程
  • 最新人脸识别开发经验demo
  • 2019年3月
  • CodeForces 226C The table[贪心]
  • 2017届校招提前批面试回顾
  • JavaScript 基本功--面试宝典
  • java多线程
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spring boot下thymeleaf全局静态变量配置
  • SQLServer之创建显式事务
  • vuex 笔记整理
  • 关于字符编码你应该知道的事情
  • 提醒我喝水chrome插件开发指南
  • 中文输入法与React文本输入框的问题与解决方案
  • 白色的风信子
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 大数据全解:定义、价值及挑战
  • ​渐进式Web应用PWA的未来
  • # .NET Framework中使用命名管道进行进程间通信
  • (1)(1.13) SiK无线电高级配置(五)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四) 虚拟摄像头vivi体验
  • (学习日记)2024.01.19
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)编辑寄语:因为爱心,所以美丽
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET 使用配置文件
  • .NET关于 跳过SSL中遇到的问题
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • []Telit UC864E 拨号上网
  • [Android]竖直滑动选择器WheelView的实现
  • [BJDCTF2020]The mystery of ip
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [Java] 什么是IoC?什么是DI?它们的区别是什么?
  • [LeetCode]Multiply Strings
  • [MAT]使用MAT比較多个heap dump文件
  • [office] excel2003进行可视性加密的方法 #媒体#其他#知识分享
  • [PAT] 1041 Be Unique (20 分)Java
  • [POJ2104]K-th Number