一种“用平衡树修改自己”的算法

最近在考试时发现可以用 \(FHQ-Treap\ O(n\log^2n)\) 做一些事情,觉得很有趣,就记录下来。若有与他人重复,还请提醒。


起因是考场上遇到了这样一个问题:

有两个数列 \(a,c\),满足 \(c_i<i\)。从前往后对于每个位置,求出一个数对 \(p_i=(a_i,d_i)\),其中 \(d_i\in [c_i,i)\),要求 \(d_i\)\([c_i,i)\)\(p_i\) 最小的位置。对于两个数对排序方式是:先比较 \(a_i,a_j\) 的大小,若相同比较 \(p_{d_i}\)\(p_{d_j}\) 的大小。要求时间复杂度为 \(O(n\log^2n)\)

容易发现,假如我们在求解 \(p_i\) 的时候,已经知道了前 \(i-1\) 个位置的 \(p\) 数组排名,那么我们可以用线段树简单维护每个 \(d_i\)。难点在于如何排序。

容易发现当你塞入一个新的数对 \(p_i\) 时,比 \(p_i\) 大的数对排名会 \(+1\)。因此考虑可以进行区间加的 \(FHQ-Treap\)。但是难点在于如何利用平衡树自身的排名进行分裂。因为假如我们只按照每个位置上记录的排名进行排序,可能会出现懒标记暂未下放的情况;而分裂操作会破坏树结构,因此普通平衡树中的查排名操作也无法实施。

考虑不下放标记,而让节点通过向上一步一步爬的方式找标记。定义 getnum(x) 函数表示我们从 \(x\) 开始,一直执行向父亲跳和给 \(x\)\(num\) 加上当前点的懒标记值的操作,最终得出的数就是这个位置的真实排名,代码如下:

inline int getnum(int x){int re=num(x);x=fa(x);while(x) re+=fl(x),x=fa(x);return re;
}

由于平衡树深度为 \(O(\log n)\),所以这一操作的时间复杂度即为 \(O(\log n)\)。由于 \(split\) 操作本身就有一个 \(\log\),所以现在 \(split\) 的总时间复杂度为 \(O(\log^2n)\)。代码如下:

inline int getnum(int x){int re=num(x);x=fa(x);while(x) re+=fl(x),x=fa(x);return re;
}
inline bool operator<(suf x,suf y){return x.fs!=y.fs?x.fs<y.fs:getnum(x.ls)<getnum(y.ls);
}
inline void push_up(int x){sz(x)=sz(ls(x))+sz(rs(x))+1;
}
inline void down(int x,int k){fl(x)+=k,num(x)+=k;
}
inline void push_down(int x){down(ls(x),fl(x)),down(rs(x),fl(x)),fl(x)=0;
}
inline void split(int x,suf v,int &a,int &b,int af,int bf){if(!x){a=b=0;return;}push_down(x);if(v<val(x)) split(ls(x),v,a,ls(b=x),af,x),fa(x)=bf;else split(rs(x),v,rs(a=x),b,x,bf),fa(x)=af;push_up(x);
}
inline int merge(int x,int y){if(!x||!y) return x|y;push_down(x),push_down(y);if(rk(x)<rk(y)) return rs(x)=merge(rs(x),y),fa(rs(x))=x,push_up(x),x;return ls(y)=merge(x,ls(y)),fa(ls(y))=y,push_up(y),y;
}

这样我们就可以用总时间复杂度 \(O(n\log^2n)\) 的做法 \(AC\) 这个问题了。由于时间复杂度非均摊,所以理论上可以做可持久化。另外,本题理论上可以将区间加改为区间反转等更复杂的区间操作。

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

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

相关文章

2025年口碑好的厌氧胶胶水厂家最新推荐权威榜

2025年口碑好的厌氧胶胶水厂家最新推荐权威榜 行业背景与市场趋势 厌氧胶作为一种高性能胶粘剂,广泛应用于机械制造、汽车工业、电子设备等领域,其独特的厌氧固化特性使其在螺纹锁固、密封、固持等场景中表现卓越…

format函数sql的指南

在SQL中,FORMAT()函数是一个非常有用的工具,它允许你以特定的格式显示日期、时间或数字。这个函数在不同的数据库系统中可能有所不同,但大多数流行的关系型数据库系统(如MySQL、PostgreSQL、SQLite等)都支持它。以…

format函数sql的技巧

在SQL中,FORMAT函数(或在某些数据库系统中称为TO_CHAR)允许你以指定的格式显示日期、时间或数字。使用FORMAT函数时,可以结合SQL的技巧来优化查询结果的可读性和格式。以下是一些使用FORMAT函数的技巧:格式化日期…

format函数sql的技巧

在SQL中,FORMAT函数(或在某些数据库系统中称为TO_CHAR)允许你以指定的格式显示日期、时间或数字。使用FORMAT函数时,可以结合SQL的技巧来优化查询结果的可读性和格式。以下是一些使用FORMAT函数的技巧:格式化日期…

【URP】Unity渲染层Rendering Layers

Unity URP 的 Rendering Layers(渲染层)功能是一种精细控制光照影响的机制,允许开发者通过层掩码(Layer Mask)将特定光源与特定 GameObject 关联,实现选择性【从UnityURP开始探索游戏渲染】专栏-直达Unity URP 的…

2025年评价高的荞麦加工成套设备厂家最新权威推荐排行榜

2025年评价高的荞麦加工成套设备厂家最新权威推荐排行榜行业背景与市场趋势随着健康饮食理念的普及,荞麦作为一种营养丰富的杂粮作物,其市场需求呈现持续增长态势。据中国粮食行业协会最新数据显示,2024年我国荞麦加…

详细介绍:Flink 的 checkpoint 对 key state 是怎么样存储的?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年比较好的陶瓷衬板用户好评厂家排行

2025年比较好的陶瓷衬板用户好评厂家排行行业背景与市场趋势陶瓷衬板作为一种高性能工业材料,凭借其优异的耐磨性、耐腐蚀性和高温稳定性,在电力、冶金、化工、建材等行业得到广泛应用。根据中国陶瓷工业协会最新发布…

零基础学习CMake--第六章:测试与调试——用CTest让项目更可靠6.3 测试报告生成:HTML/XML格式输出与持续集成(CI) - 指南

零基础学习CMake--第六章:测试与调试——用CTest让项目更可靠6.3 测试报告生成:HTML/XML格式输出与持续集成(CI) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

High-quality Surface Reconstruction using Gaussian Surfels 论文阅读 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年评价高的小麦磨面机行业内口碑厂家排行榜

2025年评价高的小麦磨面机行业内口碑厂家排行榜行业背景与市场趋势随着全球粮食加工技术的不断进步和消费者对面粉品质要求的日益提高,小麦磨面机行业迎来了新一轮的发展机遇。据中国粮食行业协会最新数据显示,2024年…

2025年口碑好的销量最好的电动车电池厂家最新热销排行

2025年口碑好的销量最好的电动车电池厂家最新热销排行行业背景与市场趋势随着全球环保意识的提升和新能源汽车产业的蓬勃发展,电动车电池市场迎来了前所未有的增长机遇。据中国汽车工业协会最新数据显示,2025年中国电…

2025年质量好的深睡记忆棉枕厂家最新TOP实力排行

2025年质量好的深睡记忆棉枕厂家最新TOP实力排行行业背景与市场趋势随着国民健康意识不断提升,睡眠经济已成为消费市场的重要增长点。据中国睡眠研究会最新发布的《2025中国睡眠健康白皮书》显示,我国功能性寝具市场…

inventor安装失败,如何使用卸载工具,完全彻底删除干净inventor各种残留注册表和文件

inventor安装失败,如何使用卸载工具,完全彻底删除干净inventor各种残留注册表和文件2025-11-21 08:15 psyyds2022 阅读(0) 评论(0) 收藏 举报inventor安装失败,如何使用inventor卸载工具,完全彻底删除干净inve…

2025年靠谱的AB枕芯厂家推荐及选购参考榜

2025年靠谱的AB枕芯厂家推荐及选购参考榜行业背景与市场趋势随着人们健康睡眠意识的不断提升,枕芯市场近年来呈现出稳健增长态势。据中国家用纺织品行业协会最新数据显示,2024年中国枕芯市场规模已达387亿元,预计20…

【机器人】RViz中LaserScan的参数信息说明 - 教程

【机器人】RViz中LaserScan的参数信息说明 - 教程2025-11-21 08:12 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

2025年热门的钙粉选粉机厂家最新推荐权威榜

2025年热门的钙粉选粉机厂家最新推荐权威榜行业背景与市场趋势随着环保政策的日益严格和工业技术的不断进步,钙粉选粉机作为水泥、建材、化工等行业的关键设备,其市场需求持续增长。据中国建材机械工业协会最新数据显…

format函数sql的实例

在SQL中,FORMAT函数可以用于格式化数字或日期。不过,具体的实现方式可能会因数据库的不同而有所差异。以下是一些常见数据库中FORMAT函数的使用示例:MySQL: 在MySQL中,你可以使用FORMAT()函数来格式化数字或日期。…

format函数sql的作用

在SQL中,FORMAT()函数是一个非常有用的字符串处理函数,它允许你按照指定的格式对字符串进行格式化。FORMAT()函数通常用于将数字、日期或其他数据类型转换为特定格式的字符串。FORMAT()函数的基本语法如下: FORMAT(…

format函数sql注意事项

在使用SQL的FORMAT函数时,需要注意以下几点:数据类型兼容性:FORMAT函数可以处理多种数据类型,包括数字、字符串和日期等。但是,不同类型的数据在格式化时可能会有不同的表现。因此,在使用FORMAT函数之前,需要确…