给n个数求能组成三角形的个数
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int main() {
int n; cin >> n;
vector<int>v(n + 1),pre(N + 1);
map<int, int>mp;
for (int i = 1; i <= n; i++) {
cin >> v[i];
pre[v[i]]++,mp[v[i]]++;
}
for (int i = 1; i <= N; i++) pre[i] += pre[i - 1];
vector<int>a, b;
for (auto it : mp) {
a.push_back(it.first);
b.push_back(it.second);
}
int ans = 0;
for (int i = 0; i < a.size(); i++) {
if (b[i] >= 3) ans += b[i] * (b[i] - 1) * (b[i] - 2) / 6;
if (b[i] >= 2) ans += b[i] * (b[i] - 1) / 2 * (pre[a[i] * 2 - 1] - b[i]);
for (int j = i + 1; j < a.size(); j++) {
if (a[j] - a[i] > a[i] + 1)
ans += b[i] * b[j] * (pre[a[j] - 1] - pre[a[i]]);
}
}
cout << ans << '\n';
}
欢迎指正