萌新求助玄学re

P2455 [SDOI2006] 线性方程组

ethan_zhou @ 2021-04-10 21:59:05

如题,以下的代码中,used数组虽然定义了,却没有使用,提交并开 O2 后 AC:记录

然而我把used数组的定义删掉后就re了。。 记录

这是咋回事呀?

//[SDOI2006]线性方程组
#include<bits/stdc++.h>
using namespace std;
const int MXN=51;
const double eps=1e-8;
int n;
bool used[MXN];
double arr[MXN][MXN],tmp[MXN];
inline bool is0(double x){return fabs(x)<=eps;}
inline void eli(double *a,double *b,int ind){
    if(is0(a[ind]) || is0(b[ind]))return;
    double rate=a[ind]/b[ind];
    for(int i=ind;i<=n+1;i++)a[i]-=rate*b[i];
}
inline int insert(double *eq){
    for(int i=1;i<=n;i++)
        if(!is0(eq[i])){
            if(!is0(arr[i][i]))eli(eq,arr[i],i);
            else{
                for(int j=i+1;j<=n;j++)eli(eq,arr[j],j);
                for(int j=1;j<i;j++)eli(arr[j],eq,i);
                for(int j=i;j<=n+1;j++)arr[i][j]=eq[j];
                return 1;
            }
        }
    return is0(eq[n+1])?0:-1;
}

int main(){
    memset(arr,0,sizeof(arr));
    scanf("%d",&n);
    bool infsol=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+1;j++)scanf("%lf",tmp+j);
        int tres=insert(tmp);
        if(tres==-1)return printf("-1"),0;
        infsol|=!tres;
    }
    if(infsol)printf("0");
    else
        for(int i=1;i<=n;i++)
            printf("x%d=%.2f\n",i,arr[i][n+1]/arr[i][i]+eps);

    return 0;
}

by JJA_ @ 2021-04-10 22:17:44

@ethan_zhou 个人认为有一个原因,是您把两个记录发成同一个了(((


by JJA_ @ 2021-04-10 22:19:35

可能是随机RE?您再交一遍试试

或者是程序出现了UB,而加上了这个bool数组刚好使内存奇怪地被占用于是避免了某个UB


by Darko1227 @ 2021-04-10 22:20:38

第一眼看上去是因为用到了下标为 n + 1 的地方,这样数组大小开到 51 刚好不够,但是不知道还有没有其他问题,orz ethan_enhe


by KellyFrog @ 2021-04-11 07:00:42

那就UB了呗(

顺便orz zzeh


by ethan_zhou @ 2021-04-11 15:00:12

@Darko1227 谢谢,好像确实是这样的


by ethan_zhou @ 2021-04-11 15:00:44

@蒟蒻JJA az,不小心粘了两遍(


|