Cod sursa(job #2478219)

Utilizator davidcotigacotiga david davidcotiga Data 21 octombrie 2019 19:33:47
Problema Numarare triunghiuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <string.h>
#include <algorithm>

using namespace std;

ifstream cin("nrtri.in");
ofstream cout("nrtri.out");

int v[805];

void merge(int arr[], int l, int m, int r)
{
	int i, j, k;
	int n1 = m - l + 1;
	int n2 = r - m;

	int L[n1], R[n2];

	for (i = 0; i < n1; i++)
		L[i] = arr[l + i];
	for (j = 0; j < n2; j++)
		R[j] = arr[m + 1 + j];

	i = 0;
	j = 0;
	k = l;
	while (i < n1 && j < n2)
	{
		if (L[i] <= R[j])
		{
			arr[k] = L[i];
			i++;
		}
		else
		{
			arr[k] = R[j];
			j++;
		}
		k++;
	}

	while (i < n1)
	{
		arr[k] = L[i];
		i++;
		k++;
	}

	while (j < n2)
	{
		arr[k] = R[j];
		j++;
		k++;
	}
}

void mergeSort(int arr[], int l, int r)
{
	if (l < r)
	{
		int m = l + (r - l) / 2;

		mergeSort(arr, l, m);
		mergeSort(arr, m + 1, r);

		merge(arr, l, m, r);
	}
}

void afiseaza(int v[], int n) {
	for (int i = 0; i < n; ++i)
		cout << v[i] << " ";
}

int cautare(int x, int l, int r) {
	int mid;
	while (l < r) {
		mid = (l + r) / 2;
		if (v[mid] <= x)
			l = mid + 1;
		else
			r = mid;
	}
	return l - 1;
}

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i)
		cin >> v[i];

	mergeSort(v, 0, n - 1);
	//sort (v, v + n);
	int rez = 0, i, j;
	for (i = 0; i < n - 1; ++i)
		for (j = i + 1; j < n; ++j)
			rez += cautare(v[i] + v[j], j + 1, n) - j;

	cout << rez;

	return 0;
}