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;

}

posted @ 2025-08-11 09:49  _Yxc  阅读(6)  评论(0)    收藏  举报