求助为什么我的差分会超时 80分

P2367 语文成绩

mowanggao @ 2024-05-10 17:38:37

//二维前缀和 
#include<iostream>
using namespace std;
const int maxn=5e6;
int x,y,z,a[maxn],mmin=maxn,n,t;
int diff[maxn];
int main(){
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)diff[i]=a[i]-a[i-1];
while(t--){//差分修改 o
    scanf("%d%d%d",&x,&y,&z);
    diff[x]+=z;
    diff[y+1]-=z;
}
for(int i=1;i<=n;i++){//差分修改还原 O
    a[i]=a[i-1]+diff[i];
    if(a[i]<mmin){
        mmin=a[i];
    }
}
printf("%d",mmin);
return 0;
}

by SuperAlex4 @ 2024-05-10 17:54:58

a[i]=a[i-1]+diff[i];

你再看看这个


by mowanggao @ 2024-05-10 18:39:11

@SuperAlex4 我看不出来,这步不是对差分进行前缀和吗,我看第一个题解也是这样写,求lao提点一下


by SuperAlex4 @ 2024-05-10 18:43:11

@mowanggao 哦我刚看错了(

是你数组开小了,大小应该开得比 5e6 大一点


by mowanggao @ 2024-05-10 18:49:51

@SuperAlex4 谢谢,感谢关注了,为什么有的时候这个数组开正好可以ac,以后是不是都得开的比范围大一点?


by SuperAlex4 @ 2024-05-10 18:59:11

@mowanggao 习惯上都是开大 我平常都开大 100 多(

主要还是开大一点不用考虑 a[1000] 需要用 1001 的空间或者一些字符串多一个 \0 也会占空间 越界会出各种调不出来的问题 那还不如直接开大一点 也不缺这点空间(


by mowanggao @ 2024-05-10 22:17:11

@SuperAlex4 好的谢谢lao


|