Cod sursa(job #500500)

Utilizator darrenRares Buhai darren Data 12 noiembrie 2010 13:32:56
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <algorithm>
#include <list>

using namespace std;

const int MOD = 3033;
list<pair<int, int> > hash[MOD];

void Add(int value)
{
	int nMOD = value % MOD;
	for (list<pair<int ,int> >::iterator it = hash[nMOD].begin(); it != hash[nMOD].end(); ++it)
		if (it->first == value)
		{
			++it->second;
			return;
		}
	hash[nMOD].push_back(make_pair(value, 1));
}

void Del(int value)
{
	int nMOD = value % MOD;
	for (list<pair<int ,int> >::iterator it = hash[nMOD].begin(); it != hash[nMOD].end(); ++it)
		if (it->first == value)
		{
			--it->second;
			if (it->second == 0)
				hash[nMOD].erase(it);
			return;
		}
}

int Find(int value)
{
	int nMOD = value % MOD;
	for (list<pair<int ,int> >::iterator it = hash[nMOD].begin(); it != hash[nMOD].end(); ++it)
		if (it->first == value)
			return it->second;
	return 0;
}

int N, R, V[1028];
long long result;

int main()
{
	ifstream fin("oite.in");
	ofstream fout("oite.out");

	fin >> N >> R;
	for (int i = 1; i <= N; ++i)
		fin >> V[i];

	sort(V, V + N);

	for (int i = 3; i < N; ++i)
		for (int j = i + 1; j <= N; ++j)
			Add(V[i] + V[j]);

	for (int i = 2; i <= N; ++i)
	{
		for (int j = i - 1; j >= 1; --j)
			result += Find(R - V[i] - V[j]);

		// Le scot toate cu i + 1 (V[i + 1] + V[k], k <= i sunt scoase)
		for (int j = i + 2; j <= N; ++j)
			Del(V[i + 1] + V[j]);
	}

	fout << result;
}