Cod sursa(job #730492)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 6 aprilie 2012 13:09:14
Problema Oite Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
struct oita {
	int val;
	short a,b;
};
vector <oita> v[10133];
int a[1025];
long long cauta(oita x)
{
	int k,p,q,mij,c,n,s;
	k=x.val%10133;
	p=0;
	q=v[k].size()-1;
	n=q;
	s=0;
	c=0;
	while(p<=q) {
		mij=(p+q)/2;
		if(v[k][mij].val<x.val)
			p=mij+1;
		else if(v[k][mij].val>x.val)
			q=mij-1;
		else {
			c=1;
			break;
		}
	}
	if(c==0)
		return 0;
	while((v[k][mij].val==v[k][mij-1].val)) 
		mij--;
	while(v[k][mij].val==x.val) {
		if((v[k][mij].val==x.val)&&(v[k][mij].a!=x.a)&&(v[k][mij].a!=x.b)&&(v[k][mij].b!=x.a)&&(v[k][mij].b!=x.b)) 
			s++;
		mij++;
	}
	if(s<0)
		while(1);
	return s;
}
inline void adauga(oita x)
{
	v[x.val%10133].push_back(x);
}
int main ()
{
	int n,s,i,j;
	long long nr;
	oita x;
	ifstream f("oite.in");
	ofstream g("oite.out");
	f>>n>>s;
	for(i=1;i<=n;i++)
		f>>a[i];
	f.close();
	sort(a+1,a+n+1);
	for(i=1;i<=n-1;i++)
		for(j=i+1;j<=n;j++) 
			if((a[i]+a[j])<=s) {
				x.val=a[i]+a[j];
				x.a=i;
				x.b=j;
				adauga(x);
			}
	nr=0;
	for(i=1;i<=n-1;i++)
		for(j=i+1;j<=n;j++) {
			x.val=s-(a[i]+a[j]);
			if(x.val>=0) {
				x.a=i;
				x.b=j;
				nr=nr+cauta(x);
			}
		}
	g<<nr/6;
	g.close();
	return 0;
}