给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';
}

欢迎指正

posted @ 2024-01-19 01:39  O_JF?  阅读(10)  评论(0编辑  收藏  举报