-2

次のコードは、高い入力制約に対して SGSEGV エラーを発生させています: 1<=t<=5

1<=n<=10^6

-10<= z <= 10 十分な量のメモリを宣言しました。大規模なメモリをグローバルに宣言しても、sigsegv エラーが発生します。理由がわかりません。ヒントはありますか?

 #include<bits/stdc++.h>
 #define _ ios_base::sync_with_stdio(0);cin.tie(0);
 using namespace std;
 int s[1000000];
 int main(){_
int t;
cin>>t;
while(t--){
    int n,i,z,sum=0,p,cnt=0;
    unsigned long long int ans=0;
    cin>>n;
    for(i=0;i<n;i++){
        cin>>z;
        sum+=z;
        s[i]=sum;
    }
    sort(s,s+n);
    i=0;
    while(i<n){
        p=s[i];
        cnt=0;
        while(s[i]==p){
            cnt++;
            i++;
        }
        ans=ans+(((unsigned long long)cnt*(cnt-1))>>1);
    }
    cnt=0;
    for(int i=0;i<n && s[i]<=0;i++){
        if(s[i]==0){
            cnt++;
        }
    }
    ans+=cnt;
    cout<<ans<<"\n";
}
return 0;
 }
4

1 に答える 1

1

このループ:

while(s[i] == p) {
    cnt++;
    i++;
}

の端から外れてsクラッシュする可能性があります。に変更します

while (i < n && s[i] == p)

一般に、(一貫して) クラッシュが発生した場合、プログラムをデバッガーで実行すると、どこでクラッシュしたかがわかります。これにより、何が問題なのかを理解できるはずです。

于 2013-11-04T19:21:53.030 に答える