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