CF1400D 题解
思路
这题我们只要 枚举 和 就行,根据乘法原理,对于每个 ,所有方案共有在 前等于 的数量乘上在 后等于 的数量即可。做一个前缀和快速求出区间相等的元素个数,前缀和也是 。
代码
# 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;
}

浙公网安备 33010602011771号