Splay/LCT

news/2026/1/18 15:35:56/文章来源:https://www.cnblogs.com/tanghg/p/19498368/lct

Splay

Splay

我们考虑在一颗 BST,用旋转操作将某个元素先提到根,使其仍是一颗 BST,这样的操作就是 \(s(x,0)\)

void splay(int x,int target){while(fa[x]!=target){int f=fa[x],gf=fa[f];if(gf==target){rotate(x);break;}if(rson(gf,f)==rson(f,x)){rotate(f);}else{rotate(x);}rotate(x);}
}

目标:把 \(x\) 旋转至 \(target\) 下方。fa[x] 表示 \(x\) 的父节点。 rson(a,b) 表示 \(b\) 是否是 \(a\) 的右孩子。

image

Rotate

image

void rotate(int x){int f=fa[x],gf=fa[f];bool p=rson(f,x),q=!p;if(gf){ch[gf][rson(gf,f)]=x;}else{root=x;}fa[x]=gf;ch[f][p]=ch[x][q],fa[ch[x][q]]=f;ch[x][q]=f,fa[f]=x;push_up(f),push_up(x);
}

注意先更新 \(f\) 数据。

Delete

先 Find,再合并两颗子树。

切割区间 \([l,r]\)

可以先将 \(l-1\) 提到根,再将 \(r+1\) 提到 \(l-1\) 下方,后发现 \([l,r]\) 一定在 \(r+1\) 的左子树中。

Splay 习题

模糊的序列

题意

给出 \(a_i\in [l_i,r_i]\),对于所有可能序列求最长严格上升子序列产长度最大值。其中 \(n\leq 3\times 10^5\)

Sol

\(f_i\) 表示长度为 \(i\) 的 LIS 的最小结尾为 \(f_i\),根据单调性 \(f_i<f_{i+1}\),即 \(f_{i+1}\geq f_i+1\)

现在考虑 \(a_i\in [l_i,r_i]\)。那么如果 \(\exists f_{i-1}<l\),那么有 \(f_i=\min(f_i,l)\),对于 \(l\leq f_{i-1}<r,f_i=\min(f_i,f_{i-1}+1)=f_{i-1}+1\)

上述操作等于在区间 \([p,q]\),在 \(p\) 处插入新 \(l\),将原来的 \([p,q]\) 右移一位整体 \(+1\)。然后删除原本的 \(q+1\) 那个位置。等价于直接在 \(p\) 前插入 \(l\),然后整体加 \(1\) 后删除 \(q+1\)

Factories Once More

题意

原题
一棵树,选 \(k\) 个点设为关键点。求两两关键点距离之和最大值

Sol

树上 dp,然后观察到有凸性,后面明可夫斯基和合并。

LCT

动态树问题,即要求我们维护一个由若干棵子节点无序的有根树组成的森林。

要求这个数据结构支持对树的分割,合并,对某个点它到根的路径的某些操作。

Link-Cut Tree 是一种用来维护动态森林连通性的数据结构,适用于动态树问题。

它采用类似树链剖分的轻重边路径剖分,把树边分成实边和虚边,采用 Splay 维护每一条实路径。

基本操作均摊 \(O(\log n)\),常数低于树剖。

LCT 的基本实现

每一条链对应着一个 Splay。

一些 Splay 构成了一个辅助树,每一颗辅助树维护一颗树,一些辅助树构成 LCT,其维护的是整个森林。

辅助树由多颗 Splay 组成,每颗 Splay 维护原树中的一条路径,且中序遍历这颗 Splay 得到的点序列,从前到后对应原树从上到下的一条路径。

image

Splay 根节点的父亲节点指向原树这个链的顶端的点的父亲节点,对应原树一条新边。

Splay 的中序遍历对应原树上链的遍历。

所以我们显然可以用辅助树还原出原树。

LCT 的操作

  1. Access(u):访问某个节点 \(u\),将根节点到 \(u\) 上的边都变为实边。
  2. MakeRoot(u):将某个节点 \(u\) 置为所在树根节点,等价于把该节点到根所有边方向取反。
  3. Link(u,v),连接 \(u,v\)
  4. Cut(u,v):分离 \(u,v\) 成两个树。
  5. FindRoot(u) 查询 \(u\) 所在树根节点。
  6. MakeTree():向森林中种植一颗新的树。-

Access

mergepictures.net-merged-1768718492.
不断将目前的点作为根旋转上去,然后连到新的父亲链的右儿子上。

int Access(int x){int p;for(p=0;x;p=x,x=f[x]){splay(x,0),ch[x][1]=p,push_up(x);}
}

通过势能分析可以得出均摊 \(O(\log n)\)

MakeRoot

维护路径信息一定会出现路径深度无法严格递增的情况,根据辅助树的性质,这样的路径无法出现在 Splay 中。

考虑将树看为有向树,换根相当于将 \(u\) 到现根的路径方向换向。

发现先 Access(u) 后将 \(u\) 所在的 splay 翻转即可。

void MakeRoot(int x){x=Access(x);swap(ch[x][0],ch[x][1]);tag_swp[x]^=1;
}

FindRoot

Access(u),由于根节点深度最小,我们在 \(u\) 所在的 Splay 中直接找出深度最小的点,注意下传懒标记。

int FindRoot(int u){u=Access(u);while(ch[u][0]){push_down(u);u=ch[u][0];}splay(u,0);return u;
}

Split

MakeRoot(u),再 Access(v)

void Split(int u,int v){MakeRoot(u);if(FindRoot(v)!=u){exit(1);}Access(v);
}

MakeRoot(u),然后将 \(u\) 的父亲指向 \(v\)

void Link(int u,int v){MakeRoot(u);if(FindRoot(v)==u){return;}f[u]=v;
}

Cut

Split(u,v),然后 splay(v),由于此时 \(v\) 是根,那么 \(u\) 一定是 \(v\) 的儿子,那么双向断开即可。

void Cut(int u,int v){Split(u,v);splay(v,0);ch[v][0]=f[u]=0;
}

P3203 [HNOI2010] 弹飞绵羊

题意

对于 \(x\)\(x\leftarrow x+k_x\),求多少次 \(x>n\),有带修改 \(k_i\)

Sol(待补)

P1501 [国家集训队] Tree II

题意

一棵树,点权为 \(1\)

  1. \(u,v\) 路径加 \(c\)
  2. \((u,v)\) 边删掉,加上边 \((p,q)\) 保证仍未树。
  3. 路径乘 \(c\)
  4. 求路径点权和。

Sol

LCT 懒标记下传。

P2387 [NOI2014] 魔法森林

题意

给无向图,求 \(1\)\(n\) 路径上最小的 \(\max(a_i)+\max(b_i)\)
\(n\leq 50000,m\leq 10^5\)

Sol

考虑暴力做法。按照 \(a_i\) 从小到达排序,一条条加边,每一次对于 \(b_i\) 做最小生成树,选取生成树最大的边与 \(a_i\) 求和,整个过程取最小值。

考虑优化。在最小生成树加入新边,产生一个环,我们只需删除环上最大边。

即:连接两个点,删除两个点的边,找路径最大值和路径位置。

P4299 首都

题意

维护森林,动态加边,询问某点所在树中心,询问所有树的重心异或和。两个重心找编号小的。

Sol

重心每个子树大小都不超过整个整棵树的一半。

把两棵树通过一条边连接成一棵树,新的重心一定在原来的两个重心的路径上。

向重心移动,最大子树大小一定在变小。我们记一下原来的重心 \(c_1,c_2\)。我们考虑 Cut\(c_1,c_2\) 的路径。

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

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

相关文章

基于可视分析技术的深度学习模型构建与优化【附源码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 成品或定制&#xff0c;查看文章底部微信二维码 &#xff08;1&#xff09;多层级可视化的深度学习模型构建体系 面对深度学习…

移除链表元素-day03

203. 移除链表元素 题目链接:https://leetcode.cn/problems/remove-linked-list-elements/description/ 思路:在原来的链表中新增一个节点,这个节点作为头结点(好处,不用单独处理原链表的头结点) 代码: public …

Java Web 核心全解析 - 实践

Java Web 核心全解析 - 实践2026-01-18 15:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

制图不用愁!CAXA 电子图板 2025 最新版本国标图库一键调用

CAXA 电子图板 2025 是国产自主的二维 CAD 软件,贴合国标、高效易用、兼容性强,主打机械制图,是替代海外 CAD 的高性价比选择。核心亮点:自主双内核:支持 EXB 原生格式和 DWG 格式双向转换,数据互通无壁垒,版权…

基于深度学习的信道编码识别与扰码分析【附完整代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制&#xff0c;查看文章底部微信二维码&#xff08;1&#xff09;基于Inception结构的信道编码盲识别模型 在非合作通信…

2026年知名的石墨烯涂料设计推荐排行,光固化保护套/石墨烯涂料/无溶剂环氧涂料,石墨烯涂料源头厂家推荐排行榜 - 品牌推荐师

近年来,随着工业防腐需求升级与环保政策趋严,石墨烯涂料凭借其优异的导电性、耐腐蚀性及环保特性,成为防腐材料领域的“新宠”。据行业数据预测,2026年国内石墨烯涂料市场规模将突破百亿元,应用场景从传统管道、桥…

基于多特征融合的深度学习高速铁路预售期购票量预测

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制&#xff0c;查看文章底部微信二维码&#xff08;1&#xff09;高铁客流数据的时空特征解析与工程化处理 高铁旅客购票…

基于深度学习实现透过动态厚散射介质成像

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制&#xff0c;查看文章底部微信二维码&#xff08;1&#xff09;动态厚散射介质传播模型的建立与散斑数据生成透过散射…

基于深度学习的轮胎缺陷智能无损检测

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制&#xff0c;查看文章底部微信二维码&#xff08;1&#xff09;轮胎缺陷图像数据集构建与检测难点分析轮胎作为汽车与…

说说金华值得参加的AI营销赋能研讨会,精准获客不是梦 - 工业品牌热点

在数字经济重塑产业格局的当下,传统制造业的营销困局日益凸显——高昂的拓客成本、低效的线索转化、被动的客户跟进,正成为制约企业发展的紧箍咒。如何借助AI技术破局?2026年1月16日,由台州菜根发展创新中心、梦想…

深度测评专科生必用AI论文网站TOP10:开题报告文献综述全攻略

深度测评专科生必用AI论文网站TOP10&#xff1a;开题报告文献综述全攻略 2026年专科生论文写作工具测评&#xff1a;为何需要一份精准榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文写作工具已经成为高校学生&#xff0c;尤其是专科生群体的重要辅助工具。然而…

深度学习乳腺癌淋巴结转移与HER2评估【附源码模型】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制&#xff0c;查看文章底部微信二维码&#xff08;1&#xff09;乳腺腋窝前哨淋巴结术中冰冻切片的临床病理特征分析乳…

2026 年国产时序数据库全景观察:从“专用引擎”走向“多模融合”的必然演进

2026 年国产时序数据库全景观察&#xff1a;从“专用引擎”走向“多模融合”的必然演进 摘要 随着“数字中国”“新型工业化”与工业互联网进入深水区&#xff0c;时序数据正从边缘监控数据演变为企业核心生产要素。进入 2026 年&#xff0c;国产时序数据库不再停留在“能用、可…

揭秘spaCy库设计模式与核心架构

幕后揭秘&#xff1a;库模式与设计概念 自spaCy诞生之初&#xff0c;开发者的生产效率就一直是其设计的核心考量&#xff0c;无论是细微决策还是一些重大的架构问题。其设计理念是拥抱机器学习的复杂性&#xff0c;而非通过易泄漏的抽象将其隐藏起来&#xff0c;同时也要保持良…

遥感影像岩石信息提取深度学习方法【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制&#xff0c;查看文章底部微信二维码&#xff08;1&#xff09;基于Fisher Score-mRMR的遥感图像特征优选方法在面向对…

救命神器!专科生毕业论文TOP10 AI论文平台测评

救命神器&#xff01;专科生毕业论文TOP10 AI论文平台测评 2026年专科生毕业论文AI平台测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具辅助毕业论文写作。然而&#xff0c;面对市场上琳琅满目的论文平台…

我能训练一个ai给我的操作打分吗,比如我现在攻a点死了,那个情况往左走的行为就给负分,像ppo一样只不过是我操作

完全可以&#xff01;你描述的其实是一种人类反馈强化学习&#xff08;Human-in-the-loop Reinforcement Learning&#xff09;或模仿学习 奖励建模的思路。你可以训练一个 AI 模型来评估你的操作质量&#xff0c;甚至进一步用它来指导你或替代你进行决策。下面我分步骤说明如…

持续同调与深度学习3D点云分类方法【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制&#xff0c;查看文章底部微信二维码&#xff08;1&#xff09;多类型持续同调特征融合模型的构建与验证三维点云作为…

微信小程序毕设项目推荐-基于微信小程序的乐器商城宣传平台基于springboot+微信小程序的乐器宣传平台【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2025年烟台比较好的表冷器品牌推荐排行榜,翅片管/空调机组/乏风取热箱/新风机组/干冷器/冷却器/空气幕生产厂家找哪家 - 品牌推荐师

随着中央空调系统在工业、商业及公共建筑领域的广泛应用,表冷器作为空气处理的核心组件,其性能与可靠性直接影响整体能耗与用户体验。当前,行业面临技术同质化、交付周期长、定制化能力不足等痛点,企业需通过全链条…