Cod sursa(job #1900764)

Utilizator Razvanel6991Razvan Lazar Razvanel6991 Data 3 martie 2017 16:20:53
Problema Numarare triunghiuri Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <stdio.h>
#include <stdlib.h>

void readArray(FILE *in, int *v, int N);
void printArray(int *v, int N);
void swap(int *a, int *b);
int partition(int *v, int lower, int upper);
void quickSort(int *v, int lower, int upper);
int drawTriangles(int *v, int N);

void swap(int *a, int *b){
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

int partition(int *v, int lower, int upper){
	int pivot, i, j;
	pivot = v[upper];
	j = lower;
	for(i = 0; i <= upper - 1; i++){
		if(v[i] <= pivot){
			swap(v + i, v + j);
			j++;
		}
	}
	swap(v + j, v + upper);
	return j;
}

void quickSort(int *v, int lower, int upper){
	if(lower < upper){
		int pos = partition(v, lower, upper);

		quickSort(v, lower, pos - 1);
		quickSort(v, pos + 1, upper);
	}
}

void readArray(FILE *in, int *v, int N){
	for(int i = 0; i < N; i++){
		fscanf(in, "%d", v + i);
	}
}

void printArray(int *v, int N){
	for(int i = 0; i < N; i++){
		printf("%d ", v[i]);
	}
	printf("\n");
}

int getThirdSide(int *v, int lower, int upper, int sum){
	if(lower <= upper){
		int mid = lower + (upper - lower) / 2;

		if(v[mid] == sum){
			return 1;
		}
		if(v[mid] > sum){
			return getThirdSide(v, lower, mid - 1, sum);
		}
		else{
			return getThirdSide(v, mid + 1, upper, sum);
		}
	}
	return -1;
}

int drawTriangles(int *v, int N){
	/*
	Get 2 of sides and use binary search for the other one 
	O(n^2logn)
	*/
	int pitagora = 0, triangles = 0;
	for(int i = 0; i < N - 2; i++){
		pitagora += i * i;
		for(int j = i; j < N - 1; j++){
			pitagora += j * j;
			if(getThirdSide(v, j, N - 1, pitagora) == 1){
				triangles++;
			}
			else{
				pitagora = 0;
			}
		}
	}
	return triangles;
}

int main(){
	FILE *in, *out;
	int N, *v;

	in = fopen( "nrtri.in", "r");
	out = fopen( "nrtri.out", "w");

	fscanf(in, "%d", &N);
	v = malloc( N * sizeof(int));
	readArray(in, v, N);
	quickSort(v, 0, N-1);
	fprintf(out, "%d\n", drawTriangles(v, N));
	free(v);
	fclose(in);
	fclose(out);
	return 0;
}