做到一个题(题目传送门),暴力超时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;
}