希尔数组有没有搞头,请大佬修改
查看原帖
希尔数组有没有搞头,请大佬修改
415406
stupie_fish楼主2023/8/31 20:08

我用的希尔数组,第一个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;
}
2023/8/31 20:08
加载中...