【题解】SPOJ8791 DYNALCA - Dynamic LCA

原题链接

题意

动态求 LCA 板子题。

维护一个森林,支持加边、删边和求 LCA 操作。

思路

不难想到 LCT。

现在问题就是如何在 LCT 上求两个点 u , v u,v u,v 的 LCA。

先进行 access ⁡ ( u ) \operatorname{access}(u) access(u),此时 u u u 到根的路径已经变成一个实链。

lca ⁡ ( u , v ) \operatorname{lca}(u,v) lca(u,v) 去往 u u u 的路径的第一条边是实边,则去往 v v v 的路径的第一条边是虚边。

再进行 access ⁡ ( v ) \operatorname{access}(v) access(v),由于 lca ⁡ ( u , v ) \operatorname{lca}(u,v) lca(u,v) 到根的路径上全是实边,那么 access ⁡ \operatorname{access} access 最后改变的虚边的父亲就是 lca ⁡ ( u , v ) \operatorname{lca}(u,v) lca(u,v)

注意:求 LCA 需要考虑树的父子关系,所以在 cut 时不能使用 makeroot 操作,而 link 无所谓。


代码

#include <iostream>using namespace std;const int N = 100010;int n, m;
struct Splay_Node
{int s[2], p, v;
}tr[N];inline bool is_root(int x)
{int p = tr[x].p;if (tr[p].s[0] != x && tr[p].s[1] != x) return true;return false;
}inline void rotate(int x)
{int y = tr[x].p, z = tr[y].p;int k = tr[y].s[1] == x;if (!is_root(y)) tr[z].s[tr[z].s[1] == y] = x;tr[x].p = z;tr[y].s[k] = tr[x].s[k ^ 1], tr[tr[x].s[k ^ 1]].p = y;tr[x].s[k ^ 1] = y, tr[y].p = x;
}inline void splay(int x)
{while (!is_root(x)){int y = tr[x].p, z = tr[y].p;if (!is_root(y))if ((tr[y].s[1] == x) ^ (tr[z].s[1] == y)) rotate(x);else rotate(y);rotate(x);}
}inline int access(int x)
{int z = x, y;for (y = 0; x; y = x, x = tr[x].p)splay(x), tr[x].s[1] = y;splay(z);return y; // 这里返回的是最后一次虚实链变换时虚边父亲节点的编号。
}inline int find_root(int x)
{access(x);while (tr[x].s[0]) x = tr[x].s[0];splay(x);return x;
}inline void link(int x, int y)
{if (find_root(y) != find_root(x)) tr[x].p = y;
}inline void cut(int x) // 一定不能 makeroot!
{access(x);tr[x].s[0] = tr[tr[x].s[0]].p = 0;
}inline int lca(int x, int y)
{access(x);return access(y);
}int main()
{char op[5]; int x, y;scanf("%d%d", &n, &m);while (m -- ){scanf("%s%d%d", op, &x, &y);if (op[1] == 'i') link(x, y);else if (op[1] == 'u') cut(x);else printf("%d\n", lca(x, y));}return 0;
}

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

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

相关文章

springboot 异步执行方法详细介绍

在Spring Boot中&#xff0c;异步执行方法是一种提高应用程序性能和响应性的技术。通过异步执行&#xff0c;你可以在处理耗时的业务逻辑时&#xff0c;不需要阻塞当前线程&#xff0c;从而提高应用程序的吞吐量和并发处理能力。 基本概念 在Spring中&#xff…

【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数

前言 嘿伙计们&#xff01;准备好了吗&#xff1f;今天我要和你们探讨一个酷炫的话题——Oracle数据库&#xff01;&#x1f389; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;二&#xff09;&#xff1a;体系结构、存储结构与各类参数&#xff0c;我们要揭开Oracle数据库…

二叉搜索树——迭代实现

———————————————————— 普通的树形结构中数据是杂乱无章的&#xff0c;实际意义不大&#xff0c;要想更好的管理数据&#xff0c;需要让数据有序&#xff0c;二叉搜索树又称二叉排序树&#xff0c;是一种特殊的树形结构。 规定一般的二叉搜索树的左节点小于…

FPGA 高速接口(LVDS)

差分信号环路测试 1 概述 LVDS&#xff08;Low Voltage Differential Signalin&#xff09;是一种低振幅差分信号技术。它使用幅度非常低的信号&#xff08;约350mV&#xff09;通过一对差分PCB走线或平衡电缆传输数据。大部分高速数据传输中&#xff0c;都会用到LVDS传输。 …

使用vscode传入参数的方式进行debug

使用vscode传入参数的方式进行debug {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{&quo…

AI论文速读 |【综述】深度学习在多元时间序列插补的应用

论文标题&#xff1a; Deep Learning for Multivariate Time Series Imputation: A Survey 链接&#xff1a;https://arxiv.org/abs/2402.04059 作者&#xff1a;Jun Wang ; Wenjie Du ; Wei Cao ; Keli Zhang ; Wenjia Wang ; Yuxuan Liang ; Qingsong Wen 机构&#xff1a…

vue 学习definproperty方法

definproperty方法是Vue很重要的一个底层方法&#xff0c;掌握他的原理很重要&#xff0c;下面通过代码说明问题&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>回顾Object.defineproperty方法</title&…

堆详解以及简单的堆排序(源代码)

一、什么是堆&#xff1f; 堆是将数组看作一颗完全二叉树 大堆&#xff1a;任意一个父亲大于等于孩子 小堆&#xff1a;任意一个父亲小于等于孩子 有序数组一定是堆 但是堆不一定有序 注意&#xff1a;此“堆”是一个数据结构&#xff0c;用来表示完全二叉树 还有另外一个“…

AIGC ChatGPT4完成业务需求SQL学习

源表如下&#xff1a; 例如现在需要显示每个岗位中工资排名前10位的员工信息&#xff0c;并显示排名应该要怎么做呢&#xff1f; Prompt: 有一个某公司职员表&#xff0c;表名为Bank_emp&#xff0c;empno为员工编号&#xff0c;ename为员工姓名&#xff0c;JOB为员工岗位&…

设计健壮且可扩展的软件系统

介绍 系统设计是定义系统的架构、组件、模块、接口和数据以满足特定需求的过程。它涉及就如何构建、维护和操作软件系统做出关键决策。在本文中&#xff0c;我们将深入探讨系统设计的各个方面&#xff0c;涵盖 25 个关键主题&#xff0c;以帮助您了解设计健壮且可扩展的软件系…

平滑升级旧版nginx,使其支持健康检测模组

nginx是部署在华为欧拉的docker容器中&#xff0c;版本是2203sp1.x86_64 查看旧版nginx的版本与编译配置信息&#xff1a; nginx -Vnginx version: nginx/1.14.1 built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 (running …

Hadoop-Yarn-NodeManager如何计算Linux系统上的资源信息

一、上下文 <Hadoop-Yarn-NodeManager都做了什么>中讲节点资源监控服务&#xff08;NodeResourceMonitorImpl&#xff09;时只是提了下SysInfoLinux&#xff0c;下面我们展开讲下 SysInfoLinux是用于计算Linux系统上的资源信息的插件 二、SysInfoLinux源码 package o…

前后图片对比控件使用

在build.gradle中添加依赖&#xff1a; implementation com.github.pavel163:BifacialView:1.4.1 在布局文件中&#xff1a; <com.ebr163.bifacialview.view.BifacialViewandroid:id"id/bv_before_after"android:layout_width"match_parent"android:la…

设计模式学习笔记 - 学前简述

1.为什么学习设计模式&#xff1f; 学习设计模式的原因&#xff1a; 应对面试中的设计模式相关问题&#xff1b;写出高质量代码&#xff0c;告别让人吐槽的烂代码&#xff1b;提高复杂代码的设计和开发能力让读源码、学习框架爱事半功倍&#xff1b;为职场发展铺垫。 设计模…

LNMP搭建discuz论坛

discuz论坛是一种网络论坛软件&#xff0c;也称bbs&#xff0c;它是一种用于在互联网上建立论坛社区的程序系统。只哟中功能强大的论坛软件&#xff0c;可以帮助用户建立一个专业、完善的论坛社区&#xff0c;并且可以实现多种功能&#xff0c;如搭建用户注册、登录、查看主题、…

vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据

文章目录 一、按需引入自定义组件&#xff1a;unplugin-vue-components1. 安装[unplugin-vue-components]2. 在vite中使用 二、自动导入依赖包&#xff1a;unplugin-auto-import1.安装2.vite.config.js配置3.使用效果 三、自动生成路由&#xff1a;vite-plugin-pages1、安装2、…

任务处理 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 在某个项目中有多个任务(用tasks数组表示)需要您进行处理&#xff0c;其中tasks[i][si,ei], 你可以在si < day < ei 中的任意一天处理该任务&#xff0c;请…

代码随想录day25--回溯的应用4

LeetCode491.非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;…

【目标跟踪】提供一种简单跟踪测距方法(c++)

文章目录 一、前言二、c代码2.1、Tracking2.2、KalmanTracking2.3、Hungarian2.4、TrackingInfo 三、调用示例四、结果 一、前言 在许多目标检测应用场景中&#xff0c;完完全全依赖目标检测对下游是很难做出有效判断&#xff0c;如漏检。检测后都会加入跟踪进行一些判断或者说…

中科星图——Landsat8_C2_ST数据集是经大气校正的地表温度数据

数据名称&#xff1a; Landsat8_C2_ST 数据来源&#xff1a; USGS 时空范围&#xff1a; 2020年1月-2023年3月 空间范围&#xff1a; 全国 数据简介&#xff1a; Landsat8_C2_ST数据集是经大气校正的地表温度数据&#xff0c;属于Collection2的二级数据产品&#xff0…