Cod sursa(job #2829575)

Utilizator AswVwsACamburu Luca AswVwsA Data 8 ianuarie 2022 19:11:22
Problema Numarare triunghiuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("nrtri.in");
ofstream cout("nrtri.out");
const int NMAX = 803;
int v[NMAX];
int main()
{
    int n, i, j;
    cin >> n;
    for (i = 1; i <= n; i++)
        cin >> v[i];
    int ans = 0;
    sort(v + 1, v + n + 1);
    for (i = 1; i + 1 <= n; i++)
        for (j = i + 1; j <= n; j++)
        {
            //v[i], v[j]
            //v[i] + v[j] > x
            // v[i] + x > v[j]; x > v[j] - v[i]
            //v[j] + x > v[i]; x > v[i] - v[j]
            //max(v[j] - v[i], v[i] - v[j]) < x < v[i] + v[j]
            int val = max(v[j] - v[i], v[i] - v[j]); //lower_bound
            int st = j + 1, dr = n, med, lft, rgh;
            lft = rgh = -1;
            while (st <= dr)
            {
                med = (st + dr) / 2;
                if (v[med] >= val)
                {
                    lft = med;
                    dr = med - 1;
                }
                else st = med + 1;
            }
            if (lft == -1) continue;
            st = j + 1, dr = n;
            while (st <= dr)
            {
                med = (st + dr) / 2;
                if (v[med] <= v[i] + v[j])
                {
                    rgh = med;
                    st = med + 1;
                }
                else
                    dr = med - 1;
            }
            if (rgh != -1)
               ans += rgh - lft + 1;
        }
    cout << ans;
}