Cod sursa(job #477055)

Utilizator andrey932Andrei andrey932 Data 13 august 2010 11:38:34
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define MAXN 802
#define LMAX 30002

ifstream fin("nrtri.in");
ofstream fout("nrtri.out");
int x[MAXN],n,i,j,k,tot,ms,md,mi,mic,mare,st,dr;

int main()
{
	fin>>n;
	for(i=1;i<=n;i++) fin>>x[i];
	sort(&x[1],&x[n]);
	j=1;
	for(i=1;i<n;i++) {
		for(j=i+1;j<=n;j++) {
			ms=j+1; md=n;
			mic=abs(x[i]-x[j]);
			mare=x[i]+x[j];
			while (ms+1<md) {
				mi=(ms+md)>>1;
				if (x[mi]<mare) {
					ms=mi;
				}
				else if (mare<x[mi]) {
					md=mi;
				}
				else break;
			}
			dr=mi;
			while (x[dr]<=mare&&dr<=n) {dr++;} dr--;
			
			ms=j+1; md=n;			
			while (ms+1<md) {
				mi=(ms+md)>>1;
				if (x[mi]<mic) {
					ms=mi;
				}
				else if (mic<x[mi]) {
					md=mi;
				}
				else break;
			}
			st=mi;
			while (x[st]>=mic&&st>j) {st--;} //st--;
			tot+=dr-st;
			
		}
	}
	fout<<tot<<"\n";
	fout.close();	
	return 0;
}