Cod sursa(job #32112)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 17 martie 2007 12:24:10
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <vector>

using namespace std;

#define MAXN 1024
#define MAXS 1000009

int N, S;
int x[MAXN];

vector< pair<int, int> > hash[MAXS];

int query( int S )
{
	int p = S % MAXS;

	for (vector< pair<int, int> > :: iterator it = hash[p].begin(); it != hash[p].end(); it++)
		if ( (*it).first == S )
			return (*it).second;

	return 0;
}

void add( int S, int val )
{
	int p = S % MAXS;

	for (vector< pair<int, int> > :: iterator it = hash[p].begin(); it != hash[p].end(); it++)
		if ( (*it).first == S )
		{
			(*it).second += val;
			return;
		}

	hash[p].push_back( make_pair(S, val) );
}

int main()
{
	freopen("oite.in", "rt", stdin);
	freopen("oite.out", "wt", stdout);

	scanf("%d %d", &N, &S);
	for (int i = 0; i < N; i++)
		scanf("%d", x + i);

	int NR = 0;
	for (int i = 0; i < N; i++)
	{
		for (int j = i + 1; j < N; j++)
		{
			int _S = S - x[i] - x[j];
			if (_S < 0) continue;

			NR += query(_S);
		}
		for (int j = 0; j < i; j++)
		{
			int _S = x[i] + x[j];
			if (_S > S) continue;

			add(_S, 1);
		}
	}

	printf("%d\n", NR);

	return 0;
}