C. Tyler and Strings

C. Tyler and Strings

1.思路

对于矩阵中的每一个元素\((i,j)\),假设它在前\(i - 1\)行出现\(q\)次,在前\(j - 1\)列出现\(p\)次,产生的总贡献为:

\[q * x_i - \sum_{k = 1}^{q}{x_k} + p * y_i - \sum_{k = 1}^{p}{y_k} \]

所以我们只需要预处理出下标的前缀和与当前数的出现次数就行

#include <bits/stdc++.h>
#define PII pair<int,int>
#define LL long long
#define fi first
#define se second
#define debug(a) cout<<#a<<"="<<a<<endl;
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define sz(x) (int)x.size()
using namespace std;

int b[100010];
void solve()
{
	int n, m;
	cin >> n >> m;
	int g[n + 5][m + 5];
	LL ans = 0;
	map<int,LL>x, y;

	for(int i = 1; i <= n; i ++ ){
		for(int j = 1; j <= m; j ++ ){
			int t;
			cin >> t;
			g[i][j] = t;
			ans += i *1ll* b[t] - x[t];
			x[t] += i;
			b[t] ++;
		}
	}
	memset(b, 0, sizeof b);
	for(int j = 1; j <= m; j ++ ){
		for(int i = 1; i <= n; i ++ ){
			int t = g[i][j];
			ans += j *1ll* b[t] - y[t];
			y[t] += j;
			b[t] ++;
		}
	}
	cout << ans << endl;
}

int main()
{
	int test = 1;
	// scanf("%d",&test);
	while(test -- )
	{
		solve();
	}
	return 0;
}

posted @ 2022-03-08 17:03  合肥学院王星力  阅读(91)  评论(0)    收藏  举报