CF1400D 题解

思路

这题我们只要 O(n2)O(n^2) 枚举 jjkk 就行,根据乘法原理,对于每个 {j,k}\{j,k\},所有方案共有在 jj 前等于 aka_k 的数量乘上在 kk 后等于 aja_j 的数量即可。做一个前缀和快速求出区间相等的元素个数,前缀和也是 O(n2)O(n^2)

代码

# include <bits/stdc++.h>
# define ffor(i,name) \
	for (auto i = name.begin (); i != name.end (); ++ i)
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int t, n, a[3005], s[3005][3005];
//s[i][j] 表示 在 $a[1]~a[i] 间 =j 的个数$
ll sum;
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t --) {
		cin >> n;
		sum = 0;
		for (int i = 1; i <= n; ++ i) {
			cin >> a[i];
			for (int j = 1; j <= n; ++ j)
				s[i][j] = s[i - 1][j];
			++ s[i][a[i]];
		}
		for (int j = 2; j < n; ++ j)
			for (int k = j + 1; k < n; ++ k)
				sum += (s[n][a[j]] - s[k][a[j]]) * s[j - 1][a[k]];
		cout << sum << '\n';
	}
	return 0;
}
posted @ 2024-03-05 14:07  Vitamin_B  阅读(5)  评论(0)    收藏  举报  来源