1 条题解
-
1
-
方法1:枚举 ,复杂度 ,会超时。
-
方法2:着手点 ,发现数据范围不大。考虑对每个 进行计数, 表示 的出现次数,如果枚举 ,知道 的元素数量 , 的元素数量 ,对于 的贡献是可以计算出的 。
-
为什么可以这样做呢?
-
其实 只是说明三个数不是同一个位置,我们需要在 个数中选择 个数,原本就是一个组合问题 减去不符合题意的部分。所以只要可以维护数据的大小和个数,不必关注数据的位序。
-
注意数据需要 .
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1E9 + 7; void solve1() { int n, m; cin >> n; vector<int> a(n + 5); for (int i = 1; i <= n; i++) cin >> a[i]; ll ans = 0; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (a[i] == a[j]) continue; for (int k = j + 1; k <= n; k++) { if (a[j] == a[k] || a[i] == a[k]) continue; ans++; } } } cout << ans << endl; } void solve2() { int n, m; cin >> n; vector<int> a(n + 5), st(N, 0); for (int i = 1; i <= n; i++) cin >> a[i], st[a[i]]++; ll ans = 0, left = 0, right = n; for (int i = 0; i <= 1e5; i++) { if (st[i]) { right -= st[i]; ans += left * st[i] * right; left += st[i]; } } cout << ans << endl; } int main(int argc, char* argv[]) { int t = 1; // cin >> t; while (t--) { solve2(); } return 0; }
-
- 1
信息
- ID
- 2084
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 26
- 已通过
- 6
- 上传者