分析
所有点的曼哈顿距离可以分解成所有点的任意横坐标之间的距离,以及所有任意纵坐标的距离,对于处理所有点的距离,可以利用线段的思想,将所有点排序,第一个点很显然不用处理,第二个点需要求的距离有第二个点到第一个点的距离,第三个点需要处理到第一个点的距离,以及到第二个点的距离。
代码
cpp
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
vector<int> a[N], b[N];
void solve() {
int n, m;
cin >> n >> m;
for(int i = 1; i <= 1e5; i ++) a[i].clear(), b[i].clear();
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
int x;
cin >> x;
a[x].push_back(i);
b[x].push_back(j);
}
}
int ans = 0;
for(int i = 1; i <= 1e5; i ++) {
sort(a[i].begin(), a[i].end());
sort(b[i].begin(), b[i].end());
int s = 0;
for(int j = 0; j < a[i].size(); j ++) {
ans += j * a[i][j] - s;
s += a[i][j];
}
s = 0;
for(int j = 0; j < b[i].size(); j ++) {
ans += j * b[i][j] - s;
s += b[i][j];
}
}
cout << ans << "\n";
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
T = 1;//cin >> T;
while(T --) {
solve();
}
}