Cod sursa(job #496032)

Utilizator theodora_maneaManea Theodora Maria theodora_manea Data 27 octombrie 2010 17:01:09
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#include <stdlib.h>
 
typedef struct point {
    int z,t;
    point *leg;
};
point *h[676014];
int c,l,v[1025],nr,n1,x,s1,ok,s2,i,j,s;
 
void insert(int x,int z1,int t1) {
    point *p;
    p=new point;
    p->z=z1;
    p->t=t1;
    p->leg=h[x];
    h[x]=p;
}

int comp(const void *a,const void *b) {
	int *x=(int*)a;
	int *y=(int*)b;
	if (*x<*y) return -1;
	else if (*x==*y) return 0;
	else return 1;
}

void cautare(point *p,int s2) {
    while (p!=NULL) {
        if ((v[p->z]+v[p->t])==s2) {
           if (p->z>i && p->z>j && p->t>i && p->t>j)  {
              nr++;
		   }
	}
	p=p->leg;
   }
}
 
int main () {
    freopen("oite.in","r",stdin);
    freopen("oite.out","w",stdout);
    scanf("%d%d",&c,&l);
    n1=676013;
    for (i=0; i<c; i++) scanf("%d",&v[i]);
	qsort(v,c,sizeof(int),comp);
    for (i=0; i<c; i++) {
	  if (v[i]+v[i+1]>l) break;
      for (j=i+1; j<c; j++) {
          s=v[i]+v[j];
		  if (s>l) break;
            x=s%n1;
            if (s<=l)
          insert(x,i,j);
        }
	}
    nr=0;
    for (i=0; i<c; i++)
       for (j=i+1; j<c; j++) {
            s1=v[i]+v[j];
            s2=l-s1;
            if (s2>=0 && s2<=l) {
            x=s2%n1;
            ok=0;
            cautare(h[x],s2);

           }
        }
    printf("%d\n",nr);
    return 0;
}