首页 > 编程语言 >算重学(1) 函数式编程&DS

算重学(1) 函数式编程&DS

时间:2022-12-16 12:34:36浏览次数:64  
标签:重学 定义 val 编程 treap 满足 为根 DS ls

定义定义定义!

感觉理解分治的时候挺好用的,也就是我常说的推锅下去。

函数式线段树(主席树)

函数式平衡树 (fhq_treap)

以及若干东西,你都可以定义下去。

本质上是一个映射,对于你输入的东西映射,再通过定义去得到最终结果。



https://max.book118.com/html/2016/0304/36834109.shtm

考虑一个东西

fhq_treap 需要满足 \(val_1\) 满足 BST 性质,\(val_2\) 满足 heap 性质,你可以认为 \(val_2\) 是为了让 fhq_treap 平衡才加进去的一个随机权值。

考虑定义若干函数:

pair<int,int> split(x,k) 表示将 \(x\) 这棵树分裂成两棵 treap,满足第一棵 treap 的 \(val_1\) 的最大值小于等于 \(k\),第二棵 treap 的最小值大于 \(k\)。

考虑我仅仅只需要满足当前该咋做,接着推锅下去即可。

if(val1(x)<=k) {
	a=x; auto qwq=split(x.rs,k);
	a.rs=qwq.first;
	b=qwq.second;
} else { //则把 x 的 rs 都给 b,然后考虑 ls 即可。 
	b=x; auto qwq=split(x.ls,k);
	a=qwq.first;
	b.ls=qwq.second;
}
return mp(a,b); 

注意看我每一步只做了什么?当前是咋样的,通过子问题得到的结果来保证当前的正确性。因为只会跑 O(树高) 次,然后你 fhq_treap 保持平衡,所以复杂度就是对的。

merge(x,y) 合并 x,y 两棵树。需要注意,建议你把所有的树都看成外向树,也就是你实际上合并的是子树 x,子树 y,它可能原先所在的树并不以它为根。不过这没关系,因为我们定义就是以它为根,既然最开始的时候满足,那么我们只需要接下来每一步都满足即可。

我们限定 x,y 满足 \(\max val_1 T(x)<\min val_1 T(y)\),所以你合并的时候 \(val_1\) 的性质是很好满足的,所以你只需要满足 heap 的性质。

若我们钦定合并完是以当前的 y 为根(根据 \(val_2\) 大小钦定,即满足堆的性质),因为你要么 x 为根,要么 y 为根,因为我们不带旋转操作,下面的点没办法旋上来。

push_down(y); push_down(x);
y.ls=merge(x,y.ls); 
return y;

复杂度显然还是树高次。

因为你若以 \(y\) 为根,显然其 rs 都是直接保留的,因为你 \(x\) 不可能能插到其 rs 的。那么你只需要考虑 ls 对应的树,显然为 x,y.ls 合并起来的,注意顺序不能颠倒!需要满足定义!

然后可持久化是很好做的,具体的,你只需要根据定义来做即可。即类主席树一样定义若干个版本的树,然后你显然是要根据定义来继承旧版本信息的。

你就直接定义 split 为分裂出 2 棵新 treap,而不更改原先节点的外向边,merge 也是合并为新 treap,不更改原先 2 棵树的本身结构。

因为都是外向边,所以认子不认父,一个点可以有多个父亲,这也是为啥复杂度正确。

标签:重学,定义,val,编程,treap,满足,为根,DS,ls
From: https://www.cnblogs.com/xugangfan/p/16987040.html

相关文章

  • 分享Go书籍-《Go Web编程》
    大家好,我是沙漠尽头的狼。最近几天在看一本Go的书籍,看了100来页,感觉不错,分享给大家。书籍基本信息书籍信息:书名:GoWeb编程作者:(新加坡)郑兆雄(SauSheongChang)著;黄健......
  • 算重学(2) 函数式编程的发扬光大&点分治&边分治
    引入首先,一个朴素的想法,如何统计树上点对信息?定义solve(x)表示解决以\(x\)为根的树的问题。显然它的答案为solve(son_x)+儿子间相互的统计接下来,你考虑断掉\(x\)......
  • python协程和子进程混用编程尝试
    使用python编程,当程序是IO密集型,很多网友都推荐使用协程代替线程,因为python的多线程因为GIL的原因,并不能使用计算机CPU多核;而协程是微线程,性能更好,资源消耗更少,适合于多并......
  • python编程中的if __name__ == 'main': 的作用和原理
    大多数编排得好一点的脚本或者程序里面都有这段if__name__=='main':,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享。  1、这段代码的功能 ......
  • [读书笔记]Python编程:从入门到实践读后感
    0x00前言说句实在话,你买这本书根本就是一个错误。如果,你只是把它束之高阁,就认为自己学会了Python的话。诚如编辑所言,我自己买下这本书已经有一年多了,但真正把它读起来,......
  • Kotlin 并发编程之"协程"
    Kotlin协程简介 Kotlin,asalanguage,providesonlyminimallow-levelAPIsinitsstandardlibrarytoenablevariousotherlibrariestoutilizecoroutines.Unl......
  • hands-on-data-analysis 第三单元 模型搭建和评估
    hands-on-data-analysis第三单元模型搭建和评估文章目录​​hands-on-data-analysis第三单元模型搭建和评估​​​​1.模型搭建​​​​1.1.导入相关库​​​​1.2.数据......
  • 2.python-练习(日期-函数式编程)
    计算活的天数"""定义函数,根据生日(年月日),计算活了多天"""fromdatetimeimportdatetimedefcalculate_alive_day(year:int,month:int,day:int)->int:......
  • c#中的AOP面向切面编程
    AOP(AspctOrientedProgramming)在不修改源代码的基础上,通过特性的方式添加一些业务逻辑。就是一些特性类在asp.netcore中通过Filter库来支持AOP的,(六种)支持一、资源缓存......
  • 5.python-函数式编程
    函数式编程(1)定义:用一系列函数解决问题。--函数可以赋值给变量,赋值后变量绑定函数。--允许将函数作为参数传入另一个函数。(2)高阶函数:将函数作为参数或返回值的函数......