Cod sursa(job #730534)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 6 aprilie 2012 14:14:20
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<cmath>
#include<vector>
#define MOD 666013
using namespace std;
int n,L,v[1030];
struct Suma{int sum; vector <int> ind;};
vector <Suma> H[666013];
int sol;

inline void Citire()
{
	int i;
	ifstream fin("oite.in");
	fin>>n>>L;
	for(i=1;i<=n;i++)
		fin>>v[i];
	fin.close();
}

inline void Rezolvare()
{
	int i,j,suma,poz;
	Suma aux;
	bool gasit;
	vector <Suma>::iterator it;
	vector <int>::iterator jt;
	//Precalculare sume
	for(i=1;i<n;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			suma=v[i]+v[j];
			poz=suma%MOD;
			gasit=false;
			for(it=H[poz].begin();it!=H[poz].end() && !gasit;it++)
			{
				aux=*it;
				if(aux.sum==suma)
				{
					aux.ind.push_back(i);
					*it=aux;
					gasit=true;
				}
			}
			if(!gasit)
			{
				aux.sum=suma;
				aux.ind.clear();
				aux.ind.push_back(i);
				H[poz].push_back(aux);
			}
		}
	}
	//Rezolvare
	for(i=1;i<n;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			suma=L-v[i]-v[j];
			if(suma>=0)
			{
				poz=suma%MOD;
				gasit=false;
				for(it=H[poz].begin();it!=H[poz].end() && !gasit;it++)
				{
					aux=*it;
					if(aux.sum==suma)
					{
						gasit=true;
						for(jt=aux.ind.begin();jt!=aux.ind.end();jt++)
						{
							if(*jt>j)
								sol++;
						}
					}
				}
			}
		}
	}
}

inline void Afisare()
{
	ofstream fout("oite.out");
	fout<<sol<<"\n";
	fout.close();
}

int main()
{
	Citire();
	Rezolvare();
	Afisare();
	return 0;
}