首页 > 其他分享 >李超树浅谈

李超树浅谈

时间:2023-07-13 21:36:35浏览次数:38  
标签:log int 线段 tot 李超树 id 浅谈

李超树是一个可以多个分段一次函数,并取某个端点上所有一次分段函数的最值。基本李超树需要维护两个操作:

  • 在 \([l,r]\) 加入一条线段。
  • 询问在 \(k\) 处的最值。

李超树中,每个节点我们存储的函数编号为在这个节点代表区间中点取得最值的函数编号。

插入时,我们首先向线段树一样找到 \([l,r]\) 这个区间,如果这个区间以前的最优线段在中点处没有我们新加入的函数优,我们就交换两个线段编号,把原先在这个区间的线段继续向下递归插入。

继续向下递归插入是这个函数有可能在左右半个区间中的一个中更优,我们可以通过分类讨论来往下递归。

我们查询最值时,只要查询这个路径上所有的线段在这个点取得的值,取 \(\max\) 即可。

关于复杂度,查询显然是 \(O(\log n)\) 的,而对于插入,\([l,r]\) 一共被拆成 \(O(\log n)\) 个区间,向下查又是一个 \(\log\),所以复杂度应该是 \(\log^2 n\)。

下面的代码为动态开点写法。

代码:

struct Node{
    int ls,rs,mx,mi;
}p[N];
int tot;
inline LCT(){tot=0;}
inline void ChangeMin(int &k,int l,int r,int z,int y,int id){
    if(!k){k=++tot;assert(tot<=N-1);}
    if(l==r){if(!p[k].mi||F(p[k].mi,l)>F(id,l)) p[k].mi=id;return;}int mid=(l+r)>>1;
    if(z<=l&&r<=y){
        if(!p[k].mi) p[k].mi=id;
        if(F(p[k].mi,mid)>F(id,mid)) swap(p[k].mi,id);
        (F(id,l)<F(p[k].mi,l))?ChangeMin(ls(k),l,mid,z,y,id):ChangeMin(rs(k),mid+1,r,z,y,id);
        return;
    }
    if(z<=mid) ChangeMin(ls(k),l,mid,z,y,id);if(mid<y) ChangeMin(rs(k),mid+1,r,z,y,id);
}
inline void ChangeMax(int &k,int l,int r,int z,int y,int id){
    if(!k){k=++tot;}
    if(l==r){if(!p[k].mx||F(p[k].mx,l)<F(id,l)) p[k].mx=id;return;}int mid=(l+r)>>1;
    if(z<=l&&r<=y){
        if(!p[k].mx) p[k].mx=id;
        if(F(p[k].mx,mid)<F(id,mid)) swap(p[k].mx,id);
        (F(id,l)>F(p[k].mx,l))?ChangeMax(ls(k),l,mid,z,y,id):ChangeMax(rs(k),mid+1,r,z,y,id);
        return;
    }
    if(z<=mid) ChangeMax(ls(k),l,mid,z,y,id);if(mid<y) ChangeMax(rs(k),mid+1,r,z,y,id);
}
inline void Change(int &k,int l,int r,int z,int y,int id){
    ChangeMin(k,l,r,z,y,id);ChangeMax(k,l,r,z,y,id);
}
inline int AskMin(int k,int l,int r,int w){
    if(!k) return 0;if(l==r) return p[k].mi;
    int mid=(l+r)>>1;int id=-1;
    if(w<=mid) id=AskMin(ls(k),l,mid,w);else id=AskMin(rs(k),mid+1,r,w);
    if(id==0) return p[k].mi;
    return (F(id,w)<F(p[k].mi,w))?id:p[k].mi;
}
inline int AskMax(int k,int l,int r,int w){
    if(!k) return 0;if(l==r) return p[k].mx;
    int mid=(l+r)>>1;int id=-1;
    if(w<=mid) id=AskMax(ls(k),l,mid,w);else id=AskMax(rs(k),mid+1,r,w);
    if(id==0) return p[k].mx;
    return (F(id,w)>F(p[k].mx,w))?id:p[k].mx;
}
inline void Clear(){mset(p,0);rt=0;tot=0;}

标签:log,int,线段,tot,李超树,id,浅谈
From: https://www.cnblogs.com/HeNuclearReactor/p/17552218.html

相关文章

  • 浅谈OS命令注入漏洞(Shell注入漏洞)
    一、什么是OS命令注入?1.基本概念OS(Operatingsystem)命令注入(也称为Shell注入)是一个Web安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,这会破坏应用程序及其所有数据。2.Shell的概念:Shell翻译过来就是”壳”,操作系统的外壳。Shell接收......
  • 【Netty】「优化进阶」(二)浅谈 LengthFieldBasedFrameDecoder:如何实现可靠的消息分割?
    前言本篇博文是《从0到1学习Netty》中进阶系列的第二篇博文,主要内容是通过不同的应用案例来了解LengthFieldBasedFrameDecoder是如何处理不同的消息,实现自动分割,往期系列文章请访问博主的Netty专栏,博文中的所有代码全部收集在博主的GitHub仓库中;介绍LengthFieldBasedFrameDe......
  • 浅谈DevOps
    1.DevOps概述1.1定义DevOps(DevelopmentandOperations)是一种软件开发和运维的方法论和实践,旨在通过加强开发团队和运维团队之间的协作和整合,提高软件交付和运维的效率、可靠性和质量。传统上,开发团队负责软件开发、功能实现和变更管理,而运维团队负责部署、配置和维护生产环......
  • 【学习笔记】空空的浅谈DP
    特邀讲师:墨染空洛谷用户@Remakedalao博客中的学习笔记:https://www.cnblogs.com/dmoransky/p/14063918.htmlDP1决策单调性1.2由已知量转移:分治算法洛谷P3515:[POI2011]LightningConductor1.3由之前状态转移:单调栈上二分洛谷P1912:[NOI2009]诗人小G\(f......
  • 浅谈BIT本科数据结构与算法课程 1
    关于C++基本输入输出流#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b; cin>>a>>b; cout<<a<<endl; return0;}栈和队列关于stl#include<algorithm>vector<int>x;x.push_back(n);x.pop_back();x.back();x[1......
  • 浅谈如何向上管理
    最近听说了很多事,加之目前自己也处在被汇报以及需要向上汇报的状态中间,迫使我开始思考向上管理(managingup)这个话题。这是一个有争议的话题,很多人(包括曾经的自己)下意识的会将向上管理与徒有其表的讨好或者迎合这类负面词划上等号。借此契机在查阅了很多资料之后,才意识到它不过是一......
  • 浅谈 Excel 开发:一 Excel 开发概述
    做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识。目前Office相关的开发资料是比较少的,最最开始的时候,我看的是一本英文资料,然后再就是MSDN上面去提问了。所以我想写一点东西,让大......
  • 浅谈离散化
    离散化:首先,因为有的时候,数据范围比较大,然后但是数据量比较小,这个时候我们就可以通过离散化来让一些较为分散的数据集合起来以达到我们所需要的目的,具体操作就是用下标存储那些值eg:题目:假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行n次操作,每次操作......
  • 浅谈同步、异步、回调函数之间的关系?
    关于这个问题其实我以前没有想过,但就是在最近,我踩坑了,我才明白了这些东西,接下来我就来给大家简单的谈一下。首先,先来简单介绍一下同步、异步以及回调函数的概念,以此来帮助大家快速的理解问题同步:发出一个调用时,在没有得到结果之前,该调用就不返回;一旦调用返回,就得到返回值。换句话说......
  • OpenCV计算机视觉学习(14)——浅谈常见图像后缀(png, jpg, bmp)的区别(opencv读取语义分割m
    如果需要处理的原图及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本来不想碎碎念,但是我已经在图像后缀上栽倒两次了。而且因为无意犯错,根本找不到问题。不论是在深度学习的语义分割中,还是在图......