15分求助
查看原帖
15分求助
1332423
Killer_Steven楼主2024/8/29 21:45

做到一个题(题目传送门),暴力超时80分,改后不超时但只剩15分了,样例和自测都没问题,求大佬帮我看看。
代码:

#include<bits/stdc++.h>
#define db long double
#define ll long long
#define str string
#define dou double
using namespace std;
ll n, m, ans, a[1005][1005];
struct box           //记录每个数字在哪些地方出现过
{
	ll x[1005]/*横坐标*/, y[1005]/*纵坐标*/, top/*出现次数*/;
	bool w;
} shu[1005];
int main()
{
	ios::sync_with_stdio (false);
	cin.tie (0);
	cout.tie (0);
	cin >> n >> m;
	for (ll i = 1; i <= n; i++)
		for (ll j = 1; j <= m; j++)
		{
			cin >> a[i][j];           //输入
			shu[a[i][j]].x[++shu[a[i][j]].top] = i,
			shu[a[i][j]].y[shu[a[i][j]].top] = j;           //记录坐标
		}
	for (ll i = 1; i <= n; i++)
	{
		for (ll j = 1; j <= n; j++)
		{
			ll b = a[i][j];
			for (ll l = 1; l <= shu[b].top; l++)             //遍历出现这个数的每一个坐标
			{
				if (shu[b].x[l] != i && shu[b].y[l] != j)                   //∣shu[i].x[l]−i∣=∣shu[i].y[l]−j∣>0
				{
					if (abs (shu[b].x[l] - i) == abs (shu[b].y[l] - j)) ans++;     //同上述注释
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}
2024/8/29 21:45
加载中...