遇到一个关于快读的玄学的问题
  • 板块学术版
  • 楼主Llx2022
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/6/12 08:46
  • 上次更新2023/10/23 13:18:55
查看原帖
遇到一个关于快读的玄学的问题
828664
Llx2022楼主2023/6/12 08:46

这道题T326519 「ULSG-1」数字生命

我的疑问是为什么加了快读就TLETLE了

底下这是记录

AC不加快读 TLE加快读的

这是加快读的

#include<iostream>
using namespace std;
const int N=5E6+9;
int f[17][N];
int l[N],r[N];
int n,m,k;
int a[N];
int b[N];
template<typename T>inline void read(T &x){
	x=0;T f=1;char ch=getchar();
	while(ch<48||ch>57){if(ch=='-'){f=-1;}ch=getchar();}
	while(ch>=48&&ch<=57){x=x*10+ch-48;ch=getchar();}
	x*=f;
}
int main(){
    read(n),read(m),read(k);
    for(int i=1;i<=n;i++){
        read(a[i]);
    }
    for(int i=1;i<=16;i++){
        read(b[i]);
    }
    for(int i=1;i<=16;i++){
        for(int j=1;j<=m;j++){
            f[i][1]+=(a[j]==i);
        }
        for(int j=2;j<=n-m+1;j++){
            f[i][j]=f[i][j-1]+(a[j+m-1]==i)-(a[j-1]==i);
        }
    }
    int ans=0;
    for(int i=1;i<=n-m+1;i++){
        int wr=0;
        for(int j=1;j<=16;j++){
            if(f[j][i]!=b[j])  wr++;
        }
        if(wr==k) {
            ans++;
            l[ans]=i;
            r[ans]=i+m-1;
        }
    }
    printf("%d\n",ans);
    for(int i=1;i<=ans;i++){
        printf("%d %d\n",l[i],r[i]);
    }
    return 0;
}

这是不加快读的

#include<iostream>
using namespace std;
const int N=6E5+9;
int f[17][N];
int l[N],r[N];
int n,m,k;
int a[N];
int b[N];
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",a+i);
    }
    for(int i=1;i<=16;i++){
        scanf("%d",b+i);
    }
    for(int i=1;i<=16;i++){
        for(int j=1;j<=m;j++){
            f[i][1]+=(a[j]==i);
        }
        for(int j=2;j<=n-m+1;j++){
            f[i][j]=f[i][j-1]+(a[j+m-1]==i)-(a[j-1]==i);
        }
    }
    int ans=0;
    for(int i=1;i<=n-m+1;i++){
        int wr=0;
        for(int j=1;j<=16;j++){
            if(f[j][i]!=b[j])  wr++;
        }
        if(wr==k) {
            ans++;
            l[ans]=i;
            r[ans]=i+m-1;
        }
    }
    printf("%d\n",ans);
    for(int i=1;i<=ans;i++){
        printf("%d %d\n",l[i],r[i]);
    }
    return 0;
}
2023/6/12 08:46
加载中...