m0_69114617 2023-03-18 15:14 采纳率: 60%
浏览 31
已结题

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

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


#include <iostream>
#include<bits/stdc++.h>
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 <iostream>
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<<N[i]<<" ";
  }
  return 0;
}

  • 写回答

6条回答 默认 最新

  • 关注

    (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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 已采纳回答 3月18日
  • 创建了问题 3月18日

悬赏问题

  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决