首页 > 其他分享 >数列区间最大值(ST表)

数列区间最大值(ST表)

时间:2024-08-05 10:17:04浏览次数:15  
标签:begin ch end 数列 max 最大值 ST right aligned

预处理部分

\[\max(a[i,i+2^k-1]) =\max \left\{ \begin{aligned} \max&(a[i,i+2^{k-1}-1])\\ \max&(a[i+2^{k-1},i+2^{k-1}+2^{k-1}-1]) \end{aligned} \right.= \left\{ \begin{aligned} \max&(a[i,i+2^{k-1}-1])\\ \max&(a[i+2^{k-1},i+2^k-1]) \end{aligned} \right.= \max(a[i,i+2^k-1]) \]

查询部分

\[p=\lfloor \log_{2}{(l+r-1)} \rfloor \]

\[\max(a[l,r]) = \max \left\{ \begin{aligned} \max&(a[l,l^p-1])\\ \max&(a[r-2^p+1,r-2^p+1+2^p-1]) \end{aligned} \right. = \max \left\{ \begin{aligned} \max&(a[l,l^p-1])\\ \max&(a[r-2^p+1,r]) \end{aligned} \right. \]

代码

#include<cstdio>
#define max(x,y) (x)>(y)?(x):(y)
using namespace std;

inline int read()
{
	int x=0;bool w=true;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=false;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^'0');ch=getchar();}
	return w?x:-x;
}

const int N=1e5+5,Q=1e6+5;
int n,q;

int lg2[N],f[N][25];
inline void ST_Init()
{
	for(int i=2;i<=n;i++)
		lg2[i]=lg2[i>>1]+1;
	for(int k=1;k<=lg2[n];k++)
		for(int i=1;i+(1<<k)-1<=n;i++)
			f[i][k]=max(f[i][k-1],f[i+(1<<k-1)][k-1]);
	//max(a[i,i+2^k-1])=max(max(a[i,i+2^(k-1)-1]),max(a[i+2^(k-1),i+2^(k-1)+2^(k-1)-1=i+2^k-1]))
	return;
}
inline int ST_query(const int l,const int r)
{
	int p=lg2[r-l+1];
	return max(f[l][p],f[r-(1<<p)+1][p]);
}

int main()
{
	n=read(),q=read();
	for(int i=1;i<=n;i++)
		f[i][0]=read();
	ST_Init();
	for(int i=1;i<=q;i++)
	{
		int x=read(),y=read();
		printf("%d\n",ST_query(x,y)); 
	}
	return 0;
}

标签:begin,ch,end,数列,max,最大值,ST,right,aligned
From: https://www.cnblogs.com/jerrycyx/p/18342706

相关文章

  • please restart the tailscale
    在我们用到内网穿透要使用vpn时,我们通常是下载一个客户端,但是有些小伙伴安装完之后可能会遇到以下问题重现步骤双击下载.MSI安装Tailscale图标最初显示在任务栏中右键单击Tailscale图标不显示任何配置选项,灰色显示为“请重新启动TailscaleWIndows服务”弹出“T......
  • seaweedfs-csi-driver 运行异常:volume hasn't been staged yet
     Defaultedcontainer"csi-seaweedfs-plugin"outof:csi-seaweedfs-plugin,driver-registrar,csi-liveness-probeI080109:12:04.188240main.go:73willrunnode:true,controller:false,attacher:trueI080109:12:04.188817main.go:79connectto......
  • Flask 应用程序的 POST 请求出现 405 method not allowed 错误
    我有一个简单的Web应用程序,可以使用以下代码向选定的受访者发送消息(使用TwilioAPI):app.pyclient=Client(account_sid,auth_token)@app.route('/')defindex():returnrender_template('index.html')@app.route('/send_sms',methods=['POST......
  • 基于stm32f103c8t6的蓝牙小车(可以控制车速,以及有数码管显示速度)
    蓝牙模块的理解:蓝牙可以理解为一个无线的串口,手机和单片机之间可以通过蓝牙来发送数据,控制单片机IO口,进而来控制小车,总体的逻辑是,手机发送数据给蓝牙,蓝牙将这个数据再发送给单片机。另外蓝牙的代码跟我们学的串口通信差不多。usart2.c#include"usart2.h" voiduart......
  • systemverilog中for/foreach并行执行
    目录for-join_none并行foreach并行for-join_none并行for循环和fork-join_none语句可以组合使用来并行执行多个块,这里必须使用非阻塞的fork-join_none来启动多线程,因为使用fork-join_none时每一次循环都会创建新的fork块,并且不影响之后创建fork块,而fork-join则会阻塞后面的for......
  • 模拟实现 strstr(字符串查找) --浅谈C语言
    C字符串查找-strstr()描述C库函数char*strstr(constchar*haystack,constchar*needle)在字符串haystack中查找第一次出现字符串needle的位置,不包含终止符'\0'。声明下面是strstr()函数的声明。char*strstr(constchar*haystack,constchar*needle)参......
  • 【arxiv 2024】VideoGPT+: Integrating Image and Video Encoders for Enhanced Video
    【arxiv2024】VideoGPT+:IntegratingImageandVideoEncodersforEnhancedVideoUnderstanding一、前言Abstract1Introduction2RelatedWorks3Method4Dataset5ProposedBenchmark6Experiments7Conclusion8QualitativeResults9AdditionalImplementation......
  • 【机器学习】线性回归和逻辑回归的关系以及LinearRegression、LogisticRegression两种
    引言线性回归和逻辑回归是机器学习中两种常用的回归分析方法,它们在应用、性质和目的等方面存在显著差异文章目录引言一、线性回归1.1定义与目的1.2公式与计算1.3应用场景1.4特点与要求二、逻辑回归2.1定义与目的2.2公式与计算2.3应用场景2.4特点与要求三、......
  • Vuex的四个轻骑兵:mapState、mapGetter、mapMutation、mapAction(转载)
    vuex进阶一、state1.1引入vuex以后,我们需要在state中定义变量,类似于vue中的data,通过state来存放状态importVuefrom'vue'importVuexfrom'vuex'Vue.use(Vuex)exportdefaultnewVuex.Store({state:{//存放状态nickname:'Simba',age:20,gender:'男&......
  • AtCoder Beginner Contest 365
    AtCoderBeginnerContest365A-LeapYear给出年份,判断这一年有多少天闰年条件已经给出,逐条判断模拟即可。#include<iostream>usingnamespacestd;intmain(){inty;cin>>y;if(y%400==0||y%4==0&&y%100!=0)cout<<366<<endl;else......