Cod sursa(job #241555)

Utilizator qSortMorariu Razvan qSort Data 10 ianuarie 2009 13:15:10
Problema Medie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define _fin  "medie.in"
#define _fout "medie.out"

# define MaxN 9002
# define MaxX 7002


int  a[MaxN], rep[MaxX], n;
long sol;


void readf()
{
	int i;
	FILE *fin = fopen(_fin, "r");

	for(fscanf(fin, "%d", &n), i=1; i<=n; i++)
		fscanf(fin, "%d", a+i);

	fclose(fin);
}

void writef()
{
	FILE *fout = fopen(_fout, "w");
	fprintf(fout, "%ld\n", sol), fclose(fout);
}

int qs_poz(int st, int dr)
{
	int x = a[st];

	while ( st < dr )
	{
		while ( st < dr && a[dr] >= x ) dr--; a[st] = a[dr];
		while ( st < dr && a[st] <= x ) st++; a[dr] = a[st];
	}

	a[st] = x; return st;
}

void qs_rand(int st, int dr)
{
	int r = rand() % (dr-st+1) + st, m;
	if ( r != st )
		a[r] ^= a[st] ^= a[r] ^= a[st];

	m = qs_poz(st, dr);
	if ( st < m ) qs_rand(st, m-1);
	if ( m < dr ) qs_rand(m+1, dr);
}

long  v[MaxX];
//int rep[MaxX];
/*
   v[i] = numarul de perechi din sir care au media aritmetica i
*/

void solve()
{
	int i, j, p, step, vs, c, aux;

	qs_rand(1, n);

# define div2(x) ( ! ((x) & 1) )

	for(i=1; i<n; i++)
	{
		++rep[ a[i] ];

		for(j=i+1; j<=n; j++)
			if ( div2( aux=a[i]+a[j] ) )
				++v[aux>>1];
	}

	++rep[a[n]];

	for(i=1; i<=n; i++)
		if ( v[ a[i] ] )
			sol += long( v[ a[i] ] - rep[ a[i] ] + 1 );
}

int main()
{
	readf();
	solve();
	writef();

	return 0;
}