几次在赛场上解锁cin以后用快速输入反而报错,RE、TLE不断,fastread的板子换了好几版都不行
今天算是找到了原因,原来是cin解锁不可以和scanf 、getchar等混用!!居然会爆T和RE,可是在本地IDE编译时什么问题都没有。
把解锁删了以后用 fastread 的结果。
再加一个彩蛋:
以 ST表 为例,开数组的时候把 logN 开在前面会比开在后面快,据说快一倍。
int ST[logN][N];(√)
int ST[N][logN];(×)
放一下这道 ST表 90分的板子吧,预处理一下log应该就可加上那十分了
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=1e5+100;
int a[maxn],f[20][maxn],n;
inline int read()
{
int x=0;bool f=0;char ch=getchar();
while (ch<'0'||'9'<ch)
f|=ch=='-', ch=getchar();
while ('0'<=ch && ch<='9')
x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
void ST_prework(){
for (int i=1;i<=n;i++) f[0][i] = a[i];
int t =log(n)/log(2)+1;
for (int j=1;j<t;j++)
for (int i=1;i<=n-(1<<j)+1;i++)
f[j][i] = max(f[j-1][i] , f[j-1][i+(1<<(j-1))]);
}
int ST_query(int l,int r){
int k = log(r-l+1) / log(2);
return max(f[k][l],f[k][r-(1<<k)+1]);
}
int main(){
// cout << log(maxn)/;
int m;
cin >> n >> m ;
for (int i=1;i<=n;i++) //cin >> a[i];
a[i] = read();
// getint(a[i]);
// a[i] = in();
ST_prework();
for (int i=1;i<=m;i++){
int l,r;
l = read();
r=read();
// cin >> l >> r;
// getint(l),getint(r);
// l = in(),r=in();
cout << ST_query(l,r) << endl;
}
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
血的教训,流输入输出解锁优化和 puts() 也无法混用!!!!!!!!!!!!!!!!!!!!!!