Cod sursa(job #577360)

Utilizator cdascaluDascalu Cristian cdascalu Data 10 aprilie 2011 09:00:00
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<iostream>
#define MOD 1000003
using namespace std;
int c[1025],N,S;
vector< pair<int,int> > H[MOD];
void insert(int x)
{
	int key=x%MOD;
	for(vector< pair<int,int> >::iterator it = H[key].begin();it!=H[key].end();++it)
		if(it->first == x){++it->second;return;}
	H[key].push_back(make_pair(x,1));
}
int numara(int x)
{
	int key = x%MOD;
	for(vector< pair<int,int> >::iterator it = H[key].begin();it!=H[key].end();++it)
		if(it->first == x)return it->second;
	return 0;
}
void erase(int x)
{
	int key=x%MOD;
	for(vector< pair<int,int> >::iterator it = H[key].begin();it!=H[key].end();++it)
		if(it->first == x && it->second)
		{
			--it->second;
			return;
		}
}
int main()
{
	ifstream f("oite.in");
	f>>N>>S;
	int i,j;
	for(i=1;i<=N;++i)
		f>>c[i];
	sort(c+1,c+N+1);
	for(i=3;i<N;++i)
		for(j=i+1;j<=N;++j)
			insert(c[i] + c[j]);
	int cnt=0,aux;
	for(i=2;i<=N;++i)
	{
		for(j=1;j<i;++j)
		{
			aux = numara(S-c[i]-c[j]);
			cnt+=aux;
		}
		
		for(j=i+2;j<=N;++j)
			erase(c[i+1]+c[j]);
	}
	ofstream g("oite.out");
	g<<cnt<<"\n";
	g.close();
	return 0;
}