Cod sursa(job #56871)

Utilizator arenakadaffKadaff arenakadaff Data 30 aprilie 2007 17:26:56
Problema Oite Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>

unsigned long int v[1025] , sum[600000]  ;
long long sol ;
struct cn
{
	long int x , y ;
}conf[600000] ;

long int cmp(long int p , long int r)
{
	unsigned long int x , i , j , tmp;
	struct cn tmcn ;
	x = sum[p] ;
	i = p - 1 ;
	j = r + 1 ;
	while(5 > 0)
	{
		do
		{
			i++ ;
		}while(sum[i] < x) ;
		do
		{
			j-- ;
		}while(sum[j] > x) ;
		if(i >= j) return j ;
		tmp = sum[i] ;
		sum[i] = sum[j] ;
		sum[j] = tmp ;
		tmcn = conf[i] ;
		conf[i] = conf[j] ;
		conf[j] = tmcn ;
	}
}

void qsort(long int p , long int r)
{
	if(p < r)
	{
		long int q ;
		q = cmp(p , r) ;
		qsort(p , q) ;
		qsort(q+1 , r) ;
	}
}

int main()
{
	unsigned long int i , j , k = 1 , l , c , pozi , pozj , m , n ;
	FILE *in , *out ;
	in = fopen("oite.in" , "rt") ;
	out = fopen("oite.out" , "wt") ;
	fscanf(in, "%ld %ld" , &c , &l) ;
	for(i = 1 ; i <= c ; i++) fscanf(in , "%ld" , &v[i]) ;
	for(i = 1 ; i <= c - 1 ; i++) for(j = i + 1 ; j <= c ; j++)
	{
		sum[k] = v[i] + v[j] ;
		conf[k].x = i ;
		conf[k].y = j ;
		k++ ;
	}
	qsort(1 , k - 1) ;
	i = 1 ;
	j = k - 1 ;
	while(i < j && (sum[i] != l / 2 && l % 2 == 0))
	{
		while(sum[j] > l - sum[i]) j-- ;
		if(sum[i] + sum[j] < l)
		{
			pozi = i ;
			while(sum[pozi] == sum[i]) i++ ;
		}
		else
		{
			pozi = i ;
			pozj = j ;
			do
			{
				i++ ;
			} while(sum[i] == sum[pozi] && sum[i] < l / 2 ) ;
			do
			{
				j-- ;
			} while(sum[j] == sum[pozj] && j >= i - 1) ;
			for(m = pozi ; m < i ; m++) for(n = pozj ; n > j ; n--) if(conf[n].x > conf[m].y || conf[m].x > conf[n].y) sol++ ;
		}
	}
	if(l % 2 == 0 && sum[i] == l / 2)
	{
		pozi = i ;
		while(sum[i] == sum[pozi]) i++ ;
		for(m = pozi ; m < i ; m++) for(n = pozi ; n < i ; n++) if(conf[m].x > conf[n].y) sol++ ;
	}
	fprintf(out , "%lld" , sol) ;
	fclose(in) ;
	fclose(out) ;
	return 0 ;
}