P3379 【模板】最近公共祖先(LCA)


洛谷里面8页题解千篇一律,就没有用线段树求解的,这下不得不由本蒟蒻来生啃又臭又硬,代码又多的线段树了。

样例的欧拉序列:4 2 4 1 3 1 5 1 4

记录每个节点最早在欧拉序列中的时间,任意两个节点的LCA就是他们两个节点在欧拉序列之间,深度最小的那一个。(证明看洛谷题解)

比如2和5的LCA:4 2 4 1 3 1 5 1 4,4是深度最小的。

很显然这是RMQ问题,可以用ST表求解,但我偏不,多次询问区间求极值可以用线段树来维护。

此处维护的就是

注意建树内存大小是维护欧拉序列的大小,而不是原序列,欧拉序列是原序列的2倍大小,所以线段数要开8倍的内存。

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+1;int n,m,s,oula[N<<1],d[N],ti[N],t[N<<3];//注意是8倍大小
vector<int>e[N];
bitset<N>vis;inline int read(){int x=0;char c=getchar();while(c<48 or c>57)c=getchar();while(c>=48 and c<=57)x=(x<<3)+(x<<1)+(c xor 48),c=getchar();return x;
}int main(){n=read(),m=read(),s=read();for(int i=1,x,y;i<=n-1;++i){x=read(),y=read();e[x].push_back(y);e[y].push_back(x);}d[s]=1,n=0;auto dfs=[](int x,auto dfs){if(vis[x])return;vis[x]=true;oula[++n]=x;//欧拉序列for(auto i:e[x]){if(!vis[i]){d[i]=d[x]+1;//深度dfs(i,dfs);oula[++n]=x;//欧拉序列}}};dfs(s,dfs);for(int i=1;i<=n;++i)if(!ti[oula[i]])ti[oula[i]]=i;//欧拉时间戳auto build=[](int l,int r,int i,auto build){if(l==r){t[i]=l;//叶子节点,欧拉时间戳return;}int mid=l+r>>1;build(l,mid,i<<1,build);build(mid+1,r,i<<1|1,build);t[i]=d[oula[t[i<<1]]]<d[oula[t[i<<1|1]]]?t[i<<1]:t[i<<1|1];};build(1,n,1,build);d[0]=INT_MAX;for(int i=1,a,b;i<=m;++i){//线段树维护欧拉时间戳a=read(),b=read();if(ti[a]>ti[b])swap(a,b);auto query=[](int l,int r,int i,int x,int y,auto query){int ans=0;if(l>=x and r<=y)return t[i];//返回欧拉时间戳int mid=l+r>>1;if(x<=mid){int idx=query(l,mid,i<<1,x,y,query);ans=d[oula[idx]]<d[oula[ans]]?idx:ans;}if(y>mid){int idx=query(mid+1,r,i<<1|1,x,y,query);ans=d[oula[idx]]<d[oula[ans]]?idx:ans;}return ans;};printf("%d\n",oula[query(1,n,1,ti[a],ti[b],query)]);}return 0;
}

需要注意的是,开O2并不会带来任何优化,本蒟蒻代码是厌氧代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink -- 状态与容错

1、Stateful Operations 有状态算子&#xff1a; 有状态计算&#xff0c;使用到前面的数据&#xff0c;常见的有状态的算子&#xff1a;例如sum、reduce&#xff0c;因为它们在计算的时候都是用到了前面的计算的结果 总结来说&#xff0c;有状态计算并不是独立存在的&#xf…

ssh免密登录

单机 1 生成密钥 执行 ssh-keygen -t rsa &#xff08; 其中 rsa 是非对称算法&#xff09; 一路回车到底&#xff0c;生成密钥 且生成之后会在用户的根目录生成一个 “.ssh”的文件夹 2 添加公钥到 将 公钥内容追加到 authorized_keys 中&#xff1a; cat ~/.ssh/id_rsa.pub …

汽车网络安全渗透测试概述

目录 1.汽车网络安全法规概述 1.1 国外标准 1.2 国内标准 2.汽车网络安全威胁分析 2.1 汽车网络安全资产定义 2.2 汽车网络安全影响场景及评级示例 3.汽车网络安全渗透测试描述 3.1 参考法规 3.2 渗透测试内容 4.小结 1.汽车网络安全法规概述 近年来&#xff0c;汽车…

科技创意赋能乡村文旅振兴

近日&#xff0c;由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行&#xff0c;与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

Android UI 开发·界面布局开发·案例分析

目录 ​编辑 1. 线性布局&#xff08;LinearLayout&#xff09; 2. 相对布局&#xff08;RelativeLayout&#xff09; 3. 表格布局&#xff08;TableLayout&#xff09; 4. 帧布局&#xff08;FrameLayout&#xff09; 5. 网格布局&#xff08;GridLayout&#xff0…

Linux 学习(CentOS 7)

CentOS 7 学习 Linux系统内核作者: Linux内核版本 内核(kernel)是系统的心脏&#xff0c;是运行程序和管理像磁盘和打印机等硬件设备的核心程序&#xff0c;它提供了一个在裸设备与应用程序间的抽象层。 Linux内核版本又分为稳定版和开发版&#xff0c;两种版本是相互关联&am…

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…

网络带宽基础知识简单介绍

网络带宽基础知识简单介绍 前言一、网络带宽是什么&#xff1f;二、影响网络带宽的因素三、网络带宽的单位总结 前言 最近一些需求涉及到了网络带宽&#xff0c;整理后有了本文 一、网络带宽是什么&#xff1f; 网络带宽是指在单位时间内&#xff08;一般指的是1秒钟&#xf…

django+drf+vue 简单系统搭建 (1) - django创建项目

本系列文章为了记录自己第一个系统生成过程&#xff0c;主要使用django,drf,vue。本人非专业人士&#xff0c;此文只为记录学习&#xff0c;若有部分描述不够准确的地方&#xff0c;烦请指正。 建立这个系统的原因是因为&#xff0c;在生活中&#xff0c;很多觉得可以一两行代码…

Flutter的专属Skia引擎解析+用法原理

Skia是一款跨平台的2D图形库&#xff0c;是Google公司开发的&#xff0c;可以用于开发各种应用程序&#xff0c;如浏览器、游戏、移动应用程序等。Skia引擎的主要特点是速度快、可移植性强、占用的内存少、稳定性佳&#xff0c;适用于多种硬件平台。 Skia的目标是提供快速、高…

基于GCC的工具objdump实现反汇编

一&#xff1a;objdump介绍 在 Linux中&#xff0c;一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成&#xff0c;但目标文件具有一种特殊的设计&#xff0c;提供了灵活和多样的用途。 目标文件是包含带有附加地址和值的助记符号的路线图。这…

kubernetes集群编排(7)

目录 k8s认证授权 pod绑定sa 认证 授权 k8s认证授权 pod绑定sa [rootk8s2 ~]# kubectl create sa admin //在当前 Kubernetes 集群中创建一个名为 "admin" 的新服务账户[rootk8s2 secret]# vim pod3.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec…

Paste v4.1.2(Mac剪切板)

Paste for Mac是一款运行在Mac OS平台上的剪切板小工具&#xff0c;拥有华丽的界面效果&#xff0c;剪切板每一条记录可显示&#xff08;预览&#xff09;文本&#xff0c;图片等记录的完整内容&#xff0c;可以记录最近指定条数的剪切板信息&#xff0c;方便用户随时调用&…

软件测试入门之接口测试

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

思维模型 首因效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。先入为主&#xff0c;一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生&#xff0c;他准备参加一家知名互联网公司的面试。在面试前&#xff0c;他做了充分的准备…

NIO 笔记(一)基础内容

【笔记来自&#xff1a;it白马】 NIO基础 **注意&#xff1a;**推荐完成JavaSE篇、JavaWeb篇的学习再开启这一部分的学习&#xff0c;如果在这之前完成了JVM篇&#xff0c;那么看起来就会比较轻松了。 在JavaSE的学习中&#xff0c;我们了解了如何使用IO进行数据传输&#xf…

使用Plsql+oracle client 连接 Oracle数据库

2011年入职老东家X煤集团的时候&#xff0c;在csnd上写了一篇blog&#xff0c;题目叫“什么是ERP”&#xff0c;从此跳入DBA了这个烂坑&#xff0c;目前公司的数据库一部分是Oracle&#xff0c;另一部分是MySQL的&#xff0c;少量MSSQL&#xff0c;还需要捡起来一部分&#xff…

【JAVA学习笔记】65 - 文件类,IO流--节点流、处理流、对象流、转换流、打印流

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai 文件 一、文件&#xff0c;流 文件,对我们并不陌生&#xff0c;文件是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件..都是文件。它既可以保存一张图片…

【MongoDB】索引 - 数组字段的多键索引

数组字段创建索引时&#xff0c;MongoDB会为数组中的每个元素创建索引键&#xff08;多键索引&#xff09;&#xff0c;多键索引支持数组字段的高效查询。 一、准备工作 这里准备一些数据 db.shop.insertMany([{_id: 1, name: "水果店1", fruits: ["apple&qu…

Python测试框架之pytest快速入门

pytest是一种流行的Python测试框架&#xff0c;支持创建简单的单元测试&#xff0c;也支持创建复杂的功能和集成测试。它提供了一系列有用的功能&#xff0c;能够方便地编写&#xff0c;组织和运行测试用例&#xff0c;并生成丰富的测试报告。 pytest的主要特点包括&#xff1…