首页 > 其他分享 >ST表学习笔记

ST表学习笔记

时间:2023-10-09 20:27:10浏览次数:28  
标签:log int 笔记 ST 学习 区间 st 预处理

ST表学习笔记

st表是一种的数据结构。运用倍增思想,可以维护 RMQ (区间最值问题),预处理 \(O(N\log N)\) ,查询 \(O(1)\) 。

以求区间最大值为例。

预处理

用一个二维数组 \(f[j][i]\) 来存储一定区间内的最大值,其中 \(j\) 表示区间长度为 \(2^{j}\) , \(i\) 表示区间起点。即 \(f[j][i]\) 表示 \(\max\limits_{i\le k \le i+2^j}A_k\) 。

将一个区间分为两小段,用两小段预处理出区间的最值(似乎是 dp 思想)。

tu

code:


int f[25][Max];//长度2^25足够了
inline void build(){
    for(int i = 1;i <= n;i++){
        st[0][i]=a[i];
    }
    for(int j = 1;j <= 25;j++){
        for(int i = 1;i+(1<<j)-1 <= n;i++){
            st[j][i]=max(st[j-1][i],st[j-1][i+(1<<(j-1))]);
        }
    }
}

查询

令 \(k = log_2(r-l+1)\) ,比较 \([l,l+2^k-1]\) 和 \([r-2^k+1,r]\) 的最大值。

因为 \(2^k\) 为区间长度所以是 \(l+2^k-1\) , \(r-2^k+1\)。

证明 \([l,l+2^k-1]\) 和 \([r-2^k+1,r]\) 一定能覆盖 \([l,r]\) :

当 \(l+2^k-1=r\) 时,有\(k=log_2(r-l+1)\)

tu2

code:


inline int askMax(int l,int r){
    int k=__lg(r-l+1);
    return max(st[k][l],st[k][r-(1<<k)+1]);
}

补充(?)

__lg() 函数可以在 \(O(1)\) 时间内算出一个数的 \(log_2\)

关于为什么要声明成 \(f[长度][起点]\) : intR 说快。

标签:log,int,笔记,ST,学习,区间,st,预处理
From: https://www.cnblogs.com/2k3114/p/17753031.html

相关文章

  • C++系列十:日常学习-范围库Ranges
    目录前言介绍举例:前言不错麽内容参考https://zh.cppreference.com/w/cpp/rangesChatjpt总结注意点:确保你的C++编译器支持C++20标准包含ranges头文件views的操作是惰性的,它们不会立即执行,而是在需要时计算。这意味着你可以构建复杂的管道,而不必担心性能问题。提供......
  • Listener refused the connection with the following error: ORA-12514
    1.问题在使用OracleSQLDeveloper时,遇到以下问题:状态:失败-测试失败:Listenerrefusedtheconnectionwiththefollowingerror:ORA-12514,TNS:listenerdoesnotcurrentlyknowofservicerequestedinconnectdescriptor(CONNECTION_ID=w++gsIkwQB+f4YlRCo9RvQ==)......
  • 2023-02-06Fix dual system time problem copy
    +++title="Fixdualsystemtimeproblem"description=""date=2023-02-06T14:21:50+08:00featured=falsecomment=truetoc=truereward=truecategories=[""]tags=["ubuntu"]series=[]images=[]+......
  • 仅作笔记用:PowerShell 关闭显示器
    使用这个命令可以手动关闭显示器,这样就不需要第三方工具甚至自己写代码了。(Add-Type'[DllImport("user32.dll")]publicstaticexternintSendMessage(inthWnd,inthMsg,intwParam,intlParam);'-Namea-Pas)::SendMessage(-1,0x0112,0xF170,2)也可以写成CMD的形式......
  • stm32与dsp有什么区别
    dsp比stm32高级,处理速度也快,两个不是一个级别的。dsp要难学的多,要自己分内存,写cmd文件等等。stm32容易入门。功能上STM32F103能实现的dsp2812也能实现吗?简单的可以,毕竟不是同一级别的东西,dsp跑个100多m,stm32就不行了,高速的东西做不了。2812运算性能比STM32F103强。dsp2812即T......
  • openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw
    openGauss学习笔记-94openGauss数据库管理-访问外部数据库-mysql_fdwopenGauss的fdw实现的功能是各个openGauss数据库及远程服务器(包括数据库、文件系统)之间的跨库操作。目前支持的远程服务器类型包括Oracle、MySQL(MariaDB)、openGauss(postgres_fdw)、file_fdw、dblink。mysql_f......
  • 抽象类(abstract)和接口(interface)的区别
    抽象类(abstract)和接口(interface)的区别抽象类(abstract)只有方法名和参数,没有方法体抽象方法一般存在于抽象类中有抽象方法的一定是抽象类抽象类里不一定有抽象方法抽象类被别的类继承(继承只能单继承),子类一定要重写抽象类中的抽象方法,如果子类也是抽象类则不用重写抽......
  • java fx 报错 java.lang.instrument ASSERTION FAILED ***: “!errorOutstanding“ wi
    问题描述在javafx中遇到的错误在fxml中通过了fx:controller绑定了控制器在控制的controller里面使用了FXMLLoader.load获取这个fxml文件出现报错java.lang.instrumentASSERTIONFAILED***:"!errorOutstanding"withmessagetransformmethodcallfailedat......
  • Rust安装及学习资料
    目录官网包管理Rust程序设计语言通过例子学Rust在线运行安装rustup升级Rust卸载Rust创建项目官网https://www.rust-lang.org/zh-CN/包管理https://crates.io/Rust程序设计语言https://kaisery.github.io/trpl-zh-cn/通过例子学Rusthttps://rustwiki.org/zh-CN/......
  • Rust cargo常用命令
    目录设置国内镜像创建新项目构建项目运行项目检查项目,但不构建可执行文件运行项目的测试发布项目更新依赖查看项目依赖关系树创建新的库项目文档生成设置国内镜像cd~/.cargo#创建config文件vimconfig#添加如下镜像源[source.crates-io]registry="https://github.com/......