Pagini recente » Cod sursa (job #2864588) | Cod sursa (job #795641) | Cod sursa (job #382995) | Cod sursa (job #2128994) | Cod sursa (job #1124937)
/// Craciun Catalin
/// Nrtri
/// Cautare binara
/// www.infoarena.ro/problema/nrtri
#include <fstream>
#include <iostream>
#include <algorithm>
#define NMax 850
#define sizeMax 800000
using namespace std;
ifstream f("nrtri.in");
ofstream g("nrtri.out");
int n;
int A[NMax];
char intrare[sizeMax], *pointerTo=intrare;
long long tri=0;
int i,j;
inline int atoi()
{
int x=0;
for (;!(*pointerTo>='0' && *pointerTo<='9'); ++pointerTo);
for (; (*pointerTo>='0' && *pointerTo<='9'); ++pointerTo)
x=x*10+(*pointerTo-'0');
return x;
}
void parcurgere()
{
sort(A+1, A+n+1);
/* for (i=1;i<=n-2;i++)
for (j=i+1;j<=n-1;j++)
for (int k=j+1;k<=n;k++)
if (A[i]+A[j]>=A[k] && A[j]+A[k]>=A[i] && A[i]+A[k]>=A[j])
tri++;
else
break;
g<<tri<<'\n';
g.close(); */
for (int i=1;i<=n-2;i++) {
for (int j=i+1; j<=n-1;j++) {
int n2, s;
s=A[i]+A[j];
for ( n2= 1; 2*n2<=s; n2*=2){}
int pas, sol;
sol= j;
for ( pas = n2; pas>0; pas /= 2 ) {
if ( sol+pas<n && A[sol+pas]<=s )
sol+= pas;
}
tri+= sol-j;
}
}
g<<tri<<'\n';
g.close();
}
void citire()
{
/// Citire optimizata cu atoi
f.read(intrare, sizeMax);
n=atoi();
for (int i=1;i<=n;i++)
A[i]=atoi();
}
int main()
{
citire();
parcurgere();
return 0;
}