希尔数组有没有搞头,请大佬修改

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

stupie_fish @ 2023-08-31 20:08:50

我用的希尔数组,第一个RE,有一个MLE,有一个TLE,有没有大佬用希尔数组通过的指导一下

#include<iostream>
using namespace std;
#define xer 2000
struct {
    int b[xer];//存储格子序号
    int v[xer];//存储格子中物品的值
}a[100000];
int n, q, i, j, k, c;
void alter()
{
    int o = j % xer;
    if (a[i].b[o] == 0)//未被存储
    {
        a[i].b[o] = j;
        a[i].v[o] = k;
    }
    else if (a[i].b[o] != 0 && a[i].b[o] == j)
    {
        a[i].v[o] = k;
    }
    else//该格子被使用过了,需要找寻j格子或者第一次存储j格子
    {
        int p = o, flag = 0;//flag表示i个寄包柜的j个格子中是否已经被存储过
        while (a[i].b[o] != j)
        {
            p++;
            if (p == xer)
                p = 0;
            if (p == o)
            {
                flag = 1;
                break;
            }
        }
        if(flag==0)//被存储过则直接修改
            a[i].v[o] = k;
        else//未被存储
        {
            while (a[i].b[p] != 0)
            {
                p++;
                if (p == xer)
                    p = 0;
            }
            a[i].b[p] = j;
            a[i].v[p] = k;
        }
    }
}
void print()
{
    int o = j % xer;
    while (a[i].b[o] != j)
    {
        o++;
        if (o == xer)
            o = 0;
    }
    cout << a[i].v[o] << endl;
}
int main()
{
    cin >> n >> q;
    for (int m = 0; m < q; m++)
    {
        cin >> c >> i >> j;
        if (c == 1)
        {
            cin >> k;
            alter();
        }
        else
            print();
    }
    return 0;
}

by woshidabian @ 2023-09-02 17:08:41

用STL模板里的map啊,你这肯定空间超限


by stupie_fish @ 2023-09-06 22:13:33

@woshidabian 哈哈哈,改了一个晚上,用哈希表解决了 map可以用,不过我更喜欢用其他方法


|