首页 > 其他分享 >[Резюме] 广义李超线段树

[Резюме] 广义李超线段树

时间:2023-10-08 18:56:45浏览次数:37  
标签:函数 text 线段 李超 tag 广义 区间

前言

“李超线段树,简称李超树。它支持插入 直线线段,并查询某个横坐标处的 最值。”

本文以最大值为例,讨论广义李超线段树,与传统的李超线段树不同,它插入的是 函数 而非直线或线段,但为了保证正确的时间复杂度,对函数有较严格限制,见条件。

不展开讨论对于 \(x=k\) 时函数值相等时的具体处理,可依题意而定。

正文

广义李超线段树可以 在线 解决下述问题添加 函数 \(f_i\) 或给定 \(x\) 求 \(\max\{f_i(x)\}\).

条件

定义 \(f(x)\) 和 \(g(x)\) 的大小关系交换为从 \(f(x)>g(x)\) 变为 \(f(x)<g(x)\),或反之,则有:当 \(f\) 和 \(g\) 的大小关系交换次数 \(\le 1\) 时,函数 \(\text{v}(f,g)=1\),否则 \(\text{v}(f,g)=0\) 。当函数集合 \(F\) 满足 \(\forall \alpha,\beta\in F,\text{v}(\alpha,\beta)=1\),则 \(F\) 可以用李超线段树维护。

过程

  • 考虑区间 \([l_i,r_i]:\)

    1. 去除区间绝对劣势函数 \(f_{\text{bad}}:\forall x\in[l_i,r_i],f_{\text{bad}}(x)<f_{\text{tag}_i}(x)\),一定不是解;

    2. 保留优势函数 \(f_{\text{tag}_i}:\forall \phi,f_{\text{tag}_i}(m_i)>\phi(m_i)\) 不下放;

    3. 下放相对优势函数 \(f_{\text{good}}:\exists x\in[l_i,r_i],f_{\text{good}}(x)>f_{\text{tag}_i}(x),\text{good}\neq\text{tag}_i\) 至子区间,条件保证其在某一区间绝对劣势。

以上是插入新函数时区间需要做的事,时间复杂度 \(O(\log V)\).

  • 考虑整体:
    1. 叶子节点 \([w,w]\) 的函数中除了其区间优势函数,其他都是绝对劣势函数,会被筛掉(不考虑相同);
    2. 非叶子节点,除区间优势函数和绝对劣势函数,其他函数都下放直至成为区间绝对劣势函数,或区间优势函数留在某结点;
    3. 相对优势函数不会存在。

查询 \(k\) 时是在所有剩下的 \(\log V\) 个区间的优势函数,即非绝对劣函数内选取最大,这显然正确,时间复杂度 \(O(\log V)\).

实现

核心思想是维护 区间最优函数,及时排除不优答案,实现时,维护 \(\text{tag}_i\) 表示 \([l_i,r_i]\) 的最优函数编号,即定义域完全覆盖 \([l_i,r_i]\) 并且在 \(m_i=\dfrac{l_i+r_i}{2}\) 处 取值最大 的函数。

不考虑定义域,插入函数 \(f_j\),设当前区间为 \([l_i,r_i]\),中点为 \(m_i\)。若 \(f_j(m)>f_{\text{tag}_i}(m)\),则 \(f_j\) 比 \(f_{\text{tag}_i}\) 更优,交换 \(\text{tag}_i\) 和 \(j\);讨论 \(f_j(m)<f_{\text{tag}_i}(m)\):若 \(f_j(l_i)>f_{\text{tag}_i}(l_i)\) ,则 \(f_j,f_{\text{tag}_i}\) 大小关系交换发生在 \((l_i,m_i)\),向 \([l_i,m_i]\) 递归插入 \(f_j\);同理,若 \(f_j(r_i)>f_{\text{tag}_i}(r_i)\) ,则 \(f_j,f_{\text{tag}_i}\) 大小关系交换发生在 \((m_i,r_i)\),向 \((m_i,r_i]\) 递归插入 \(f_j\);否则,\(f_j\) 在该区间绝对劣势,舍去。

根据 Condition,两个分支至多进入一个,因此时间复杂度 \(O(\log V)\),\(V\) 为定义域。

查询 \(x=k\) 的答案,需要找到线段树上从 \([1,V]\) 到 \([k,k]\) 的路径 \(\text{Path}\),则 \(\text{ans}=\max\limits_{i\in\text{Path}} f_{\text{tag}_i}(k)\);时间复杂度 \(O(\log V)\).

引用

Alex_Wei线段树合集 \(\text{Section}\) 李超线段树。

Hanghang007 和不知名大佬的 广义李超线段树

注:只有一个交点非必要条件,反例见下;请参考 Content#Condition.

image

附注:由于保证 \(F\) 满足 \(\forall \alpha,\beta\in F,\text{v}(\alpha,\beta)=1\) 构造随机函数是困难的,所以广义李超线段树更多用于维护题目给出的近似线性或有良好性质的图形。

标签:函数,text,线段,李超,tag,广义,区间
From: https://www.cnblogs.com/prms-prmt/p/wide_sense_lichao_segment_tree.html

相关文章

  • 【bitset】【线段树】CF633G Yash And Trees 题解
    CF633G简单题。先看到子树加和子树质数个数和,果断转换为dfs序进行处理。既然有区间求和,考虑线段树。若对于每一个节点维护一个\(cnt\)数组,用二进制数\(x\)来表示,即当\(cnt_i=1\)时第\(i\)位为\(1\)。设当前节点为\(u\),左右子节点分别为\(ls\)和\(rs\)。发现......
  • 【线段树合并】CF1805E There Should Be a Lot of Maximums 题解
    CF1805E待补:有另解看到维护树上问题,可以想到线段树合并。但直接维护显然不行,要一点技巧。发现\(val\)的出现次数\(cnt_{val}\)如果\(\ge3\),那么一定是一个候选项,若\(cnt_{val}=1\),那么一定不能作为候选项。于是可以用权值线段树维护对于\(val\)有\(cnt_{val}=......
  • 线段树合并 && 分裂
    线段树合并引入线段树合并就是把两颗线段树合并起来。比如:线段树\(a\)维护\([1,1,2,0,0,2]\)。线段树\(b\)维护\([0,0,2,5,1,2]\)。合并后的线段树\(c\)所维护的序列就是\([1,1,4,5,1,4]\)。解决问题目前我所见到的线段树合并的题目,一般都是维护区间内众数之类的......
  • 73rd 2023/10/4 模拟赛总结55&广义串并联图
    这次的比赛成绩并不令人失望,因为早有准备很用心去打的一场比赛,T1T2一开始在看题目时感觉可以很容易切掉T1感觉太简单了,就再看了一遍又一遍T2动手打的时候,感觉T1没那么简单,就在想了一下,想出来了正解,但给的第三个大数据总过不了然后就先放了一下T1,去打T2,因为感觉T2很简单,而且思......
  • 关于线段树
    动态开点当到了未建立过的新点时再建立点,一般用结构体来存储线段树。大致代码:#definelxtree[x].l#definerxtree[x].r#definemid((l+r)>>1)intcnt;structnode{ intl,r; intv;}tree[N<<5];inlinevoidpushup(intx){ tree[x].v=tree[lx].v+tree......
  • 线段树学习笔记
    学习链接代码(未完成)#include<bits/std++.h>usingnamespacestd;intarray[200005],tree[200005<<2];//array是初始数组,tree是线段树voidupdate(intitem)//更新item号节点的函数,这里是最大值,也可更改为区间和、最小值等{tree[item]=max(tree[item<<1],tree[it......
  • 笔记——线段树
    蓝月の笔记——线段树篇在树状数组中,我们讲解了关于单点修改区间查询的操作。今天,我们要讲一种更加高级的数据结构,他解决的是区间修改区间查询的问题多了一个区间当然更高级啦。这个数据结构就是——线段树Luogu-P3372给定一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\)......
  • 线段树模板
    应该是做的最认真的模板了。。。namespacexds{template<classT,constintMYMAXSIZE,T(*fun)(Ta,Tb)>classSTree{private:Tt[MYMAXSIZE<<2],tag[MYMAXSIZE<<2],a[MYMAXSIZE];intnum;inlineconstintls(constintx){......
  • 【数据结构】- 线段树
    线段树简介线段树是可以维护区间信息的数据结构。线段树将每个长度不为\(1\)的区间划分成左右两个区间递归求解,故把整个线段划分为一个树形结构,通过合并左右两区间信息来求得该区间的信息。根据建树方式可分为普通线段树和动态开点线段树。根据区间信息可分为普通线段树......
  • note 线段树
    适用场景:不断区间修改、区间询问。假设我们要区间求和,\(tree\)的含义:区间的和,其两个子节点为这个区间分为两半的和。我们把一个数组\(a\)看作一颗树\(tree\),例:112333对应的\(tree\)(\(()\)里是编号,\([]\)里是对应的区间):(1)13[1,6]/......