class Solution {
public:
int triangleNumber(vector& nums) {
long n = nums.size();
int i, j, k;
int total, a, b, c;
if (n < 3) return 0;
vector ct(1001, 0), sum(2001, 0);
vector<pair<long, long>> p;
for (i = 0; i < n; i++)
ct[nums[i]]++;
sum[0] = 0; // 0 cannot form triangle
for (i = 1; i <= 1000; i++)
sum[i] = sum[i - 1] + ct[i];
p.clear();
for (i = 1; i <= 1000; i++) if (ct[i] > 0)
p.push_back(make_pair(i, ct[i]));
for (i = 1001; i <= 2000; i++) sum[i] = sum[1000];
c = p.size();
total = 0;
for (a = 0; a < c; a++) { if (p[a].second >= 2) {
// a = b < c; total += (sum[p[a].first * 2 - 1] - sum[p[a].first]) * (p[a].second * (p[a].second - 1) / 2); // a = b = c if (p[a].second > 2)
total += (p[a].second * (p[a].second - 1) / 2 * (p[a].second - 2) / 3);
}
for (b = a + 1; b < c; b++) {
// a < b < c
total += (sum[p[a].first + p[b].first - 1] - sum[p[b].first]) * p[a].second * p[b].second;
// a < b = c if (p[b].second > 1)
total += p[a].second * (p[b].second * (p[b].second - 1) / 2);
}
}
return total;
}
};