C语言差分对比出错,不理解

这两个代码有啥区别啊,上面这个我写的,下面这个别人的正确答案,但是我测试用例4个错三个,我不理解差在哪


#include 
#include
using namespace std;
int main()
{
  long long int N,Q;
  cin>>N>>Q;
long long int p[N],d[N];
  for(int i =1;i<=N;i++)
  {
  cin>>d[i];
  p[i]=d[i]-d[i-1];
  }

 for(int i =1;i<=Q;i++)
 {
  long long int l,r,x;
   cin>>l>>r>>x;
   p[l]=p[l]+x;
   p[r+1]=p[r+1]-x;
 }
 for(int i =1;i<=N;i++)
 {
   d[i]=d[i-1]+p[i];
 if(d[i]<0)
 printf("0 ");
 else
  printf("%d ",d[i]);
 }
  // 请在此输入您的代码
  return 0;
}
#include 
const int maxn=500005;
long long N[maxn]={0};
long long b[maxn]={0};
using namespace std;
int main()
{
  int P,Q;
  cin>>P>>Q;
  for(int i=1;i<=P;i++){
    cin>>N[i];
    b[i]=N[i]-N[i-1];//定义差分和数组
  }
  while(Q>0){
    long long l,r,x;
    cin>>l>>r>>x;
    b[l]+=x;
    b[r+1]-=x;//对两端进行操作
    Q--;
  }
  for(int i=1;i<=P;i++){
    N[i]=b[i]+N[i-1];//最后回归原来数组 
    if(N[i]<0){
      cout<<0<<" ";
    }else
    cout<" ";
  }
  return 0;
}

(1)long long int p[N],d[N];这里没有初始化;你后面的代码中,当i=1时,p[i-1]就是p[0],这是一个未初始化的变量,可能是一个非常大的负数
(2)第一个for循环中,当 i = N时,P[N]越界,对于long long int p[N]来说,下标范围从0到N-1,也就是P[0]到P[N-1],P[N]导致数组越界。
修改方法:
把 ong long int p[N],d[N];这一句改为:


long long int p[N + 2] = { 0 }, d[N + 2] = { 0 };  //增大数组大小,同时把元素初始化未0

参考GPT和自己的思路:

两段代码的主要区别在于差分的处理方式。第一个代码中,差分数组是在输入数据时就计算出来的,因此在修改操作时需要注意边界的处理,同时在输出时也需要进行累加计算。而第二段代码中,先输入原始数组,后面再计算差分,并且在修改操作时直接通过对差分数组进行加减来实现操作。另外,第二段代码中没有使用额外的数组保存差分结果,而是直接对原始数组进行修改,最后再回归到原始数组并输出。可能是因为这些细节方面的不同,导致了测试结果的不一致。建议您仔细分析两段代码的差异,对比调试后再进行修改,以获得正确的结果。

参考GPT和自己的思路:

这两段代码的主要区别在于数组的定义和初始化。

第一个代码中,数组p和d是在运行时动态定义的,并且没有被初始化。在for循环中,数组d的下标从1开始,因此在第一次赋值时会超出数组的范围,导致出错。此外,在循环结束后,数组d的最后一个元素会被多次赋值,因为下标从1开始,而不是从0开始。

第二个代码中,数组N和b是在编译时静态定义的,并且被初始化为0。在for循环开始之前,数组N已经被完全初始化,因此在循环中可以使用下标为1的元素。此外,在for循环结束后,数组N的最后一个元素也只被赋值了一次,因为下标从0开始。

因此,第二个代码更为可靠,也更易于阅读和理解。

这个你输出每一步的中间结果对照下

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632