A. Weird Sum
https://codeforces.com/problemset/problem/1648/A
思路:对每个color维护一个rows和cols的vector,用于计算不同的rows和cols的距离,排序后直接算即可。
总结:思路没错,但是没处理好坐标升序计算的问题,直接遍历mat不行,比如按行遍历,那么当前列的左边计算可以直接减,但是右边的数计算就要把绝对值加进去,而这样的计算考虑累加和是不可能的,所以必须先存储所有要参与计算的下标,然后直接非降序排序。
inline void solve() {
int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m));
for (auto& x : a) {
for (auto& y : x) {
cin >> y;
}
}
vector<vector<int>> rows(1e5 + 10);
vector<vector<int>> cols(1e5 + 10);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
auto color = a[i][j];
rows[color].push_back(i + 1);
cols[color].push_back(j + 1);
}
}
long long ans = 0;
for (int i = 1; i <= 1e5; ++i) {
if (rows[i].empty()) {
continue;
}
sort(rows[i].begin(), rows[i].end());
long long sum = 0;
int cnt = 0;
for (auto index : rows[i]) {
ans += 1ll * index * cnt - sum;
cnt ++;
sum += index;
}
}
for (int j = 1; j <= 1e5; ++j) {
if (cols[j].empty()) {
continue;
}
sort(cols[j].begin(), cols[j].end());
long long sum = 0;
int cnt = 0;
for (auto index : cols[j]) {
ans += 1ll * index * cnt - sum;
sum += index;
cnt ++;
}
}
cout << ans << endl;
}

浙公网安备 33010602011771号