Cod sursa(job #594183)

Utilizator maritimCristian Lambru maritim Data 6 iunie 2011 16:21:07
Problema Oite Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
#include<algorithm>
#include<malloc.h>
using namespace std;

#define M 10001

typedef struct _nod
{
	int info;
	int a;
	int b;
	struct _nod *adr;
} nod;

typedef struct
{
	struct _nod *cap;
} list;

int A[1031];
list H[M+100];
int N;
int L;
int nr = 0;

int h(int r)
{	return r%M;	}

bool distinct(int a,int b,int c,int d)
{
	if(a == b || a == c || a == d || b == c || b == d || c == d)
		return false;
	return true;
}

int add2(int a,int b,int r)
{
	nod *q = H[h(r)].cap;
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = r;
	nou->a = a;
	nou->b = b;
	nou->adr = H[h(r)].cap;
	H[h(r)].cap = nou;
}

int search(int a,int b,int r)
{
	int nr = 0;
	nod *q = H[h(r)].cap;
	while(q)
	{
		if(q->info == r)
			if(distinct(a,b,q->a,q->b))
				nr ++;
		q = q->adr;
	}
	return nr;
}

int main()
{
	FILE *f = fopen("oite.in","r");
	FILE *g = fopen("oite.out","w");
	
	fscanf(f,"%d %d",&N,&L);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d ",&A[i]);
	for(int i=1;i<=N;i++)
		for(int j=i+1;j<=N;j++)
			add2(i,j,A[i]+A[j]);
	for(int i=0;i<M;i++)
	{
		nod *q = H[i].cap;
		while(q)
		{
//			printf("%d \n",q->info);
			nr += search(q->a,q->b,L-q->info);
			q = q->adr;
		}
	}
	fprintf(g,"%d ",nr/6);
	
	fclose(g);
	fclose(f);
	return 0;
}