数组大小导致[部分]测试点RE是为什么?

P3613 【深基15.例2】寄包柜

dreamtouch @ 2022-08-26 23:22:38

https://www.luogu.com.cn/record/85159090 \ 这个能过

https://www.luogu.com.cn/record/85159077\ 这个只过了一个

区别只在于两次代码的数组大小不同 (请忽略前面的注释部分)


by HeCao2008 @ 2022-08-27 00:28:11

lz,我看不到代码诶


by HeCao2008 @ 2022-08-27 00:28:38

@dreamtouch 大概率,大概率是数组,我看不到代码无法评价


by CH_mengxiang @ 2022-08-27 09:50:49

如果你的数组大小指的是定义时方框里写的数的话。。。

举个栗子:数组开100意味着在Linux(现在评测机一般都是Linux系统)下只能访问0-99,访问100+会出错(运行时错误Runtime Error,RE),叫做访问越界。数组开小了导致访问越界就会出现这种情况。


by dreamtouch @ 2022-08-27 13:19:25

@PRC_Dreamwastaken 不是越界,re的那个代码数组更大


by dreamtouch @ 2022-08-27 13:23:04

#include<iostream>
#include<ctime>
using namespace std;
long long p = 11000000021;//大质数,超过100000*100000+100000
long long a = -1, b = -1;//全域函数的参数,暂时设为-1
long long first[100001];//first[i]表示哈希值为i的数据构成的链表的首位
int sum;//sum用作累计哈希表list的存放位置
struct contain {
    long long k, x, next;//k是卫星数据,x是查找的关键字,next是链表的下一个位置
}list[100001];
long long haxi(long long x) {//全域函数
    if (a == -1) {//如果是第一次调用,则随机设定全域函数参数的值
        srand(time(0));
        a = 1.0 * rand() / RAND_MAX * p;
        b = 1.0 * rand() / RAND_MAX * p;//其实可能随机得不太好
    }
    return ((a * x + b) % p) % 100000;
}
void put_haxi(long long X,long long K) {
    long long h = haxi(X);
    sum++;
    if (!first[h]) {    
        first[h] = sum;
        list[sum].k = K;
        list[sum].x = X;
        return;
    }
    long long pos = first[h];
    while (list[pos].next) {
        if (list[pos].x == X) {
            list[pos].k = K;
            return;
        }
        pos = list[pos].next;
    }
    if (list[pos].x == X) {
        list[pos].k = K;
        return;
    }
    list[pos].next = sum;
    list[sum].k = K;
    list[sum].x = X;
    return;
}
long long search(long long X) {
    long long h = haxi(X);
    long long pos = first[h];
    while (list[pos].next){
        if (list[pos].x == X) {
            return list[pos].k;
        }
        pos = list[pos].next;
    }
    if (list[pos].x == X) {
        return list[pos].k;
    }
    return -1;
}
int main() {
    long long N, Q;
    cin >> N >> Q;
    long long a, I, J, K;
    for (long long i = 1; i <= Q; i++) {
        cin >> a >> I >> J;
        if (a == 1) {
            cin >> K;
            put_haxi(100000 * I + J, K);
        }
        else {
            cout << search(100000 * I + J)<<"\n";
        }
    }
    return 0;
}

这个是ac代码,但把数组扩大10倍后只有一个点过


by 心灵震荡 @ 2022-12-08 17:07:15

@dreamtouch tlqtj,jbl


by Tx1234567 @ 2023-01-12 20:17:04

vector

|