Cod sursa(job #598335)

Utilizator ChallengeMurtaza Alexandru Challenge Data 25 iunie 2011 14:40:08
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>

using namespace std;

const char InFile[]="oite.in";
const char OutFile[]="oite.out";
const int MaxN=1024;
const int MOD=3033;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,S,V[MaxN],sol;
vector<int> H[MOD];

inline void add(int val)
{
	if(val<0)
	{
		return;
	}
	int key=val%MOD;
	H[key].push_back(val);
}

inline void erase(int val)
{
	if(val<0)
	{
		return;
	}
	int key=val%MOD;
	vector<int>::iterator it;
	for(it=H[key].begin();it!=H[key].end();++it)
	{
		if(*it==val)
		{
			break;
		}
	}
	if(it!=H[key].end())
	{
		if(*it==val)
		{
			*it=H[key][H[key].size()-1];
			H[key].pop_back();
		}
	}
}

inline int count(int val)
{
	if(val<0)
	{
		return 0;
	}
	int cnt=0;
	int key=val%MOD;
	vector<int>::iterator it;
	for(it=H[key].begin();it!=H[key].end();++it)
	{
		if(*it==val)
		{
			++cnt;
		}
	}
	return cnt;
}

int main()
{
	fin>>N>>S;
	for(register int i=0;i<N;++i)
	{
		fin>>V[i];
	}
	fin.close();

	for(register int i=2;i<N;++i)
	{
		for(register int j=i+1;j<N;++j)
		{
			add(V[i]+V[j]);
		}
	}

	for(register int i=1;i<N-2;++i)
	{
		for(register int j=0;j<i;++j)
		{
			sol+=count(S-V[i]-V[j]);
		}
		for(register int j=i+2;j<N;++j)
		{
			erase(V[i+1]+V[j]);
		}
	}

	fout<<sol;
	fout.close();
	return 0;
}