ST表学习笔记

ST表是什么:

是一种用来存储区间最值的数据结构。

ST表的作用:

快速的查询给定区间中的最大值或最小值。

预处理实现:

枚举i,对于每一个位置 p,先预处理出从该点 p 开始,一直到 p+2^i-1(i={0,1,2,3...log(n)) 区间内的最大值或最小值,然后进行查询。

但是暴力求的话时间复杂度显然很大,所以我们需要考虑优化。如果我们用 st[i][j] 维护从点 i 开始,一直到 i+2^j-1表示观察我们维护的区间可以发现:

                                st[i][j+1]其实就是 max(st[i][j],dp[i+(1<<(j))][j]

那么我们就可以用 nlogn 的时间复杂度预处理出st数组了,代码如下:

    s=(int)(log(n)/log(2));
    for(int j=1;j<=s;j++)
    {
    	for (int i=1;i<=n-(1<<j)+1;i++)
    	{
    		dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    	}
	}

查询实现:

对于一个区间 [l,r] 如果要查询它的最值,那么可以考虑用以 l 为起点 和以 r 为终点的两个区间的最值求,如图所示:

那么我们只需要找到这两个区间对应的 st[i][j] 即可。

对于区间1, i 很很好表示,就是 l ,而 j 就是 lg(r-l+1)/lg(2) 。

对于区间2,i就是 r-2^j+1 ,j也是 lg(r-l+1)/lg(2) 。

那么答案就显然了,为 max(dp[l][j],dp[r-(1<<j)+1][j])  ,代码如下:

    for(int i=1;i<=m;i++) 
    {
        scanf("%d%d",&l,&r);
  		int p=(int)(log(r-l+1)/log(2));
        printf("%d\n",max(dp[l][p],dp[r-(1<<p)+1][p]));
    }

洛谷上有一道模板题,可以去看一下

附此题AC代码qwq。

#include<bits/stdc++.h> 
using namespace std;
 
int dp[100001][40],s,n,m,l,r;
signed main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {	
        scanf("%d",&dp[i][0]);
    }
    s=(int)(log(n)/log(2));
    for(int j=1;j<=s;j++)
    {
    	for (int i=1;i<=n-(1<<j)+1;i++)
    	{
    		dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    	}
	}
    for(int i=1;i<=m;i++) 
    {
        scanf("%d%d",&l,&r);
  		int p=(int)(log(r-l+1)/log(2));
        printf("%d\n",max(dp[l][p],dp[r-(1<<p)+1][p]));
    }
    return 0;
}

如有错误求大佬指出,蒟蒻感激不尽qaq。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用内容,STM32C8T6是一款通用增强型的48脚单片机,具有64K闪存和LQFP封装。它适用于工业级温度范围-40~85度。下面是一些关于STM32C8T6学习笔记: 1. 学习资料:可以从ST官方网站下载STM32C8T6的数据手册和参考手册,这些手册包含了该单片机的详细信息和使用方法。 2. 开发环境:为了开始学习STM32C8T6,你需要安装相应的开发环境。ST官方提供了一款免费的集成开发环境(IDE)——STM32CubeIDE,它可以帮助你进行代码编写、调试和下载。 3. 编程语言:STM32C8T6可以使用多种编程语言进行开发,包括C语言和汇编语言。C语言是最常用的编程语言,它可以通过STM32CubeIDE进行编写和调试。 4. 引脚配置:在使用STM32C8T6之前,你需要了解每个引脚的功能和配置。数据手册中有一张引脚功能,可以帮助你了解每个引脚的用途和配置方法。 5. 时钟配置:STM32C8T6具有多个时钟源和时钟分频器,你需要根据自己的需求配置正确的时钟。时钟配置对于外设的正常工作非常重要。 6. 中断和定时器:STM32C8T6支持中断和定时器功能,这些功能可以帮助你实现各种任务和功能。你可以通过配置中断和定时器来实现外设的响应和定时操作。 7. 外设驱动:STM32C8T6具有丰富的外设,包括GPIO、UART、SPI、I2C等。你可以根据自己的需求选择合适的外设,并学习如何配置和驱动这些外设。 8. 调试和下载:在开发过程中,你可以使用STM32CubeIDE提供的调试功能来调试你的代码。一旦代码调试完成,你可以使用ST-Link或其他下载器将代码下载到STM32C8T6上运行。 希望以上笔记对你学习STM32C8T6有所帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值