st表总结

P3865 【模板】ST 表

#include <bits/stdc++.h>
using namespace std;

int n,m,x[1000001],lg[1000001],st[1000001][50];

inline int read()
{
	int xx=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){xx=xx*10+ch-48;ch=getchar();}
	return xx*f;
}

int main()
{
	n = read(),m = read();
	lg[0] = -1;
	for (int i = 1; i <= n; i++)
	{
		x[i] = read();
		lg[i] = lg[i - 1] + ( ( 1 << (lg[i - 1] + 1) ) == i);
	}
	for (int i = 1; i <= n; i++)
	{
		st[i][0] = x[i];
	}
	for (int i = 1; i <= lg[n] + 1; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			st[j][i] = max(st[j][i - 1],st[j + (1 << (i - 1))][i - 1]);
		}
	}
	int a,b,l;
	while(m--)
	{
		a = read(),b = read();
		l = b - a + 1;
		printf("%d\n",max( st[a][lg[l]],st[b - (1 << lg[l]) + 1][lg[l]] ));
	}
	return 0;
}

lg函数: l g i lg_{i} lgi表示满足 2 j < = i 2^{j}<=i 2j<=i的最大 j j j,可利用递推的方式得到,注意 l g 0 = − 1 lg_{0}=-1 lg0=1,每一个新的数超过前一个的 2 j + 1 2^{j+1} 2j+1了,就加 1 1 1

st函数:类似倍增的转移

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值