首页 > 其他分享 >ST表

ST表

时间:2023-05-05 20:46:55浏览次数:34  
标签:lg https int st 数组 ST

ST表的数组st[i][k]指从i开始2^k个数里的最值
最直观的用法应该就是求区间最值,即RMQ问题(Range Minimum/Maximum Query)
预处理O(nlogn) 查询O(1)

例题 洛谷P3865 【模板】ST 表
https://www.luogu.com.cn/problem/P3865

#include<iostream>
#include<cmath>
#define forup(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
int n,m;
int st[100100][20];
int lg[100005];
inline int read()
{
	int n=0;
	char m=getchar();
	while(m<'0'||m>'9') m=getchar();
	while(m>='0'&&m<='9')
	{
		n=(n<<1)+(n<<3)+(m^'0');
		m=getchar();
	}
	return n;
} 
int num[100];
inline void write(int a)
{
	int len=0;
	do num[len++]=a%10; while(a/=10);
	while(len--) putchar(num[len]+'0');
}
void ST()
{
	forup(i,1,n)
	{
		st[i][0]=read();
	}
	int p=lg[n];
	forup(k,1,p)
	{
		forup(i,1,n-(1<<k)+1)
		{
			st[i][k]=max(st[i][k-1],st[i+(1<<(k-1))][k-1]);//i开始的2^k个中的最大值等于i开始2^(k-1)的最值a1和i+2^(k-1)开始2^(k-1)的最值a2的较大者 
			//<<优先级比+-低,要加括号 
		}
	}
}
inline int query(int l,int r)
{
	int p=lg[r-l+1];//找到p满足2^p<len且2^p+2^p>=len 
	return max(st[l][p],st[r-(1<<p)+1][p]);//从l开始往后2^p和从r开始往前2^p,两者的并集就是[l,r],也是因此2^p<len 
	//<<优先级比+-低,要加括号 
}
void lg_init()
{
	forup(i,2,n) lg[i]=lg[i>>1]+1;
}
int main()
{	

	cin>>n>>m;
	lg_init();//初始化lg数组 
	ST();//建st表 
	int l,r;
	forup(i,1,m)
	{
		l=read(),r=read();
		int p=lg[r-l+1]; 
		write(query(l,r)); putchar('\n');
	}
	return 0;
 } 

有几个点,
一是<<和>>的优先级是比+-低的,所以要额外加括号;
二是关于lg数组是用来提高效率的,用log2也没什么不可;
另外之前了解到的递推式是下面这个
lg[i]=lg[i-1]+((1<<(lg[i-1]+1))==i);
显然,还是现在这个更简洁也快理解也比较容易

参考:https://blog.csdn.net/m0_46201544/article/details/125270545
运算符优先级:https://blog.csdn.net/nicky_zs/article/details/4053146

标签:lg,https,int,st,数组,ST
From: https://www.cnblogs.com/V-sama/p/17375304.html

相关文章

  • 小D-新版接口自动化教程- http 请求 Requests 实战
     #-*-coding:UTF-8-*-importrequestsresponse=requests.get("https://www.baidu.com")print(response.text)......
  • String、StringBuilder、StringBuffer
    String真正不可变有下面几点原因:保存字符串的数组被final修饰且为私有的,并且String类没有提供/暴露修改这个字符串的方法。String类被final修饰导致其不能被继承,进而避免了子类破坏String不可变。String:不可变,线程安全StringBuilder:可变,单线程,线程不安全StringBuf......
  • string为接口的注意事项
    string为接口的注意事项问题描述​在一个应用程序中用到了另外一个库的dll,向dll的接口传递std::string参数时报错。由于这方面的问题比较多,所以我进行了深入研究。前置知识在vs项目右键->属性->C/C++->代码生成->运行库,有四个选项,/MD、/MDd、/MT、/MTd含有D的选项......
  • [WUSTCTF2020]level2 1
    查壳:32位,有个小壳,怎么办,脱了呗,还能这么办(方法见前文)https://www.cnblogs.com/TFOREVERY/p/17366210.html脱壳后,进入IDA找主函数:脸上就是flag{Just_upx_-d}收工。......
  • AtCoder Regular Contest 131 E Christmas Wreath
    洛谷传送门AtCoder传送门不难猜想有解充要条件为\(n\ge5\)且\(\frac{n(n-1)}{2}\bmod3=0\)。发现如果钦定一个点的出边都为同一种颜色,那么条件\(2\)一定满足。那么题目等价于把\(\{0,1,...,n-1\}\)分成\(3\)组使得每组的和相等。这个东西可以随便dp做,也不......
  • 第九篇——通达信指标公式编写常用函数(五)——BARSLAST(从零起步编写通达信指标公式系列
    内容提要:本文主要介绍了编写通达信指标公式常用函数BARSLAST以及综合运用最近讲过的函数编写MACD零轴之上首次金叉选股公式。 一、BARSLAST函数简介含义:上一次条件成立到当前的周期数 使用方法:BARSLAST(X),上一次X条件成立到当前的周期数 举例:BARSLAST(CROSS(MA......
  • RestHighLevelClient 使用总结
    .index接口--新增/更新索引,内容更新是覆盖式的.update接口--更新索引,支持局部字段的更新,相对.index接口相比,减少了没有必要的字段更新 相关文档:https://zhuanlan.zhihu.com/p/551414799......
  • AtCoder Regular Contest 131 D AtArcher
    洛谷传送门AtCoder传送门观察可以发现:使每支箭的距离都为\(D\)一定不劣;每支箭坐标一定为整数;设最左边的箭坐标为\(x\),那么\(x\)太小时可以把最左边的箭移到最右边,\(x\)太大时可以把最右边的箭移到最左边。计算可得\(x\)的最优取值范围为\(x\in[-\left\lfloor\fr......
  • XDU_B-Test_Weather-Report
    XDU_B-Test_Weather-Report使用语言/环境/API语言:Swift环境:XcodeVersion14.3(14E222b)/SimulatoriPhone14Pro/实机iPhone7PlusAPI:和风天气实现效果屏幕上面一个蓝到紫的渐变色按钮,允许访问位置后按很多次就可以显示当前城市/最高温度最低温度/AQI总而言之是一......
  • elasticsearch集群及kibana安装
    系统配置创建一个用户elastic,不能使用root用户启动配置该用户环境变量,用户home目录.bash_profile文件#配置ES_JAVA_HOME使用es自带jdkexportES_JAVA_HOME=/data/es/elasticsearch/jdk#修改最大文件句柄数ulimit-n65535#修改最大线程数ulimit-u4096执行..bash_p......