Cod sursa(job #1522055)

Utilizator sabin.antoheSabin Antohe sabin.antohe Data 11 noiembrie 2015 09:56:26
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<fstream>
#include<algorithm>
#include<iostream>
using namespace std;

int v[1000];
int n;

int binary(int st, int dr, int x, int i, int j) {
  int mid = (st+dr) / 2;
  if(x == v[mid]) {
    if(mid == i || mid == j)  return -1;
   return mid;
  }
  if(st >= dr)  return -1;

  if(v[mid] > x)
    return binary(st, mid-1, x, i, j);
  else
    return binary(mid+1, dr, x, i, j);
}

int main(void) {
  ifstream fin("nrtri.in");
  ofstream fout("nrtri.out");

  fin >> n;
  for(int i = 0; i < n; i++)
    fin >> v[i];
  
  sort(v, v + n);
  int nr = 0;

  for(int i = 0; i < n; i++)
    for(int j = i+1; j < n; j++) {
      int max1 = v[i] + v[j];
      int min1 = v[j] > v[i] ? v[j] - v[i] : v[i] - v[j];
      
      int k = min1-1;
      do {
        k++;
        min1 = binary(0, n-1, k, i , j);
      } while(k < max1 && min1 == -1);

      if(min1 < 0) continue;
      
      k = max1+1;
      do {
        k--;
        max1 = binary(0, n-1, k, i , j);
      } while(k > v[min1] && max1 == -1);
      
      if(max1 < 0) continue;
      
      //cout << v[i] << " " << v[j] << " " << v[min1] << " " << v[max1] << endl;
      nr += max1 - min1 + 1;

      if(i >= min1 && i <= max1) nr--;
      if(j >= min1 && j <= max1) nr--;      
    }
  fout << nr / 3;
}