Cod sursa(job #989285)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 25 august 2013 13:58:14
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("nrtri.in");
ofstream g("nrtri.out");
int Array[802],Result,N;
bool Use[802][802][802];
void Read()
{
    int i;
    f>>N;
    for(i=1;i<=N;i++)
        f>>Array[i];
    sort(Array+1,Array+N+1);
}
void Binary_Search1(int poz1,int poz2)
{
    int mid,st=poz1+1,dr=poz2-1,sol1=0,sol2=1,used=0;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(Array[mid]>=Array[poz1]+Array[poz2])
        {
            dr=mid-1;
            continue;
        }
        if(Array[poz2]>=Array[mid]+Array[poz1])
            st=mid+1;
        if(Array[poz2]<Array[mid]+Array[poz1] && Array[poz2]+Array[poz1]>Array[mid])
        {
            sol1=mid;
            st=mid+1;
        }
    }
    st=poz1+1,dr=poz2-1;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(Array[mid]>=Array[poz1]+Array[poz2])
        {
            dr=mid-1;
            continue;
        }
        if(Array[poz2]>=Array[mid]+Array[poz1])
            st=mid+1;
        if(Array[poz2]<Array[mid]+Array[poz1] && Array[poz2]+Array[poz1]>Array[mid])
        {
            sol2=mid;
            dr=mid-1;
        }
    }
    for(int i=sol2;i<=sol1;i++)
    {
        if(Use[i][poz1][poz2]==1)
            used++;
        Use[i][poz1][poz2]=Use[poz1][poz2][i]=Use[i][poz2][poz1]=Use[poz1][i][poz2]=Use[poz2][poz1][i]=Use[poz2][i][poz1]=1;
    }
    Result+=sol1-sol2+1-used;
}
void Binary_Search2(int poz1,int poz2)
{
    int mid,st=poz2+1,dr=N,sol1=0,sol2=1,used=0;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(Array[mid]>=Array[poz1]+Array[poz2])
        {
            dr=mid-1;
            continue;
        }
        if(Array[poz2]>=Array[mid]+Array[poz1])
            st=mid+1;
        if(Array[poz2]<Array[mid]+Array[poz1] && Array[poz2]+Array[poz1]>Array[mid])
        {
            sol1=mid;
            st=mid+1;
        }
    }
    st=poz2+1,dr=N;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(Array[mid]>=Array[poz1]+Array[poz2])
        {
            dr=mid-1;
            continue;
        }
        if(Array[poz2]>=Array[mid]+Array[poz1])
            st=mid+1;
        if(Array[poz2]<Array[mid]+Array[poz1] && Array[poz2]+Array[poz1]>Array[mid])
        {
            sol2=mid;
            dr=mid-1;
        }
    }
    for(int i=sol2;i<=sol1;i++)
    {
        if(Use[i][poz1][poz2]==1)
            used++;
        Use[i][poz1][poz2]=Use[poz1][poz2][i]=Use[i][poz2][poz1]=Use[poz1][i][poz2]=Use[poz2][poz1][i]=Use[poz2][i][poz1]=1;
    }
    Result+=sol1-sol2+1-used;
}
void Browse()
{
    int i,j;
    for(i=1;i<=N;i++)
        for(j=i+1;j<=N;j++)
        {
            Binary_Search1(i,j);
            Binary_Search2(i,j);
        }
}
int main()
{
    Read();
    Browse();
    g<<Result<<"\n";
    return 0;
}