ST表-模板-洛谷P3865

这篇博客介绍了ST表作为解决静态区间最值查询的模板,并通过一道洛谷题目阐述了在面对时间限制较高的问题时,应当使用快速读取和printf输出以确保O(1)的时间复杂度。博主分享了在实现过程中遇到的输出问题及其解决方案。

一、写在前面

刚开始学习一个新玩意的时候当然是写一个模板了,对于静态的区间最值查询,ST表是个好方法。这道模板题强调了“最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1)”,下面就用实际经历“解释一下”。
先贴代码。

二、代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e6+10;
vector<int> a;
int d[maxn][25];
int n,m,p;
inline int read(){
  char ch=getchar();
	int ans=0,f=1;
  while(ch<'0'||ch>'9'){
	  if(ch=='-') f=-1;
		ch=getchar();
	}
  while(ch>='0'&&ch<='9'){
	  ans=ans*10+ch-'0';
		ch=getchar();
	}
  return ans*f;
}
void rmq_init(){
	for(int i=0;i<n;i++) d[i][0]=read();
	for(int j=1;j<=21;j++)
	  for(int i=0;i+(1<<j)-1<n;i++)
	    d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
int rmq(int l,int r){
	int k=log2(r-l+1); 
	return max(d[l][k],d[r-(1<<k)+1][k]);
}
int main(){

	n=read();
	m=read();
	
	rmq_init();
  int x,y;
  for(int i=0;i<m;i++){
  	x=read();
  	y=read();
  	x--;
  	y--;
  	printf("%d\n",rmq(x,y));
	}
	return 0;
} 

值得注意的是,这里要用快读,否则就会这样:在这里插入图片描述
然而当时自己改了半天代码,直到没办法看了题解才知道要用快读。
然而更尴尬的是,用了快读之后:
在这里插入图片描述
为什么呢?因为我是用cout流输出答案的,改为printf之后就全对了:在这里插入图片描述

三、总结

对时间要求高的题目,在求解时,读入用快读,输出用printf而不是cout

四、作者

Bowen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值