关于ios::sync_with_stdio(false)引发的RE、TLE问题

本文通过实战案例揭示了C++中使用cin解锁与其他输入方式混用导致的问题,并提供了正确的fastread实现方法。同时分享了一个关于ST表数组声明顺序对效率影响的小技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几次在赛场上解锁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() 也无法混用!!!!!!!!!!!!!!!!!!!!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值