ST表-模板-洛谷P3865

一、写在前面

刚开始学习一个新玩意的时候当然是写一个模板了,对于静态的区间最值查询,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

发布了50 篇原创文章 · 获赞 7 · 访问量 1142

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103359801
今日推荐