Cod sursa(job #389360)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 februarie 2010 14:59:38
Problema Oite Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <ctime>

using namespace std;

#define file_in "oite.in"
#define file_out "oite.out"


#define mod 100007
#define Nmax 2297378

long long my_time;
long long nr;
int v[Nmax],s,n;
vector<int> G1[mod+10];
vector<long long> G2[mod+10];
char q[2974947];
int x;

void add2(int x)
{
	int k=x%mod;
	
	G1[k].push_back(x);
}



int find2(int x)
{
	vector<int> :: iterator it;
	
	int k=x%mod;
	int cnt=0;
	for (it=G1[k].begin();it!=G1[k].end();++it)
		 if (*it==x)
			cnt++;
	return cnt;	 
		 
}



void sterge2(int x)
{
	int k=x%mod;
	
		
	vector<int> :: iterator it;
	
	for (it=G1[k].begin();it!=G1[k].end();++it)
		 if (*it==x)
		 {
			 G1[k].erase(it);
			 return ;
		 }
}


void add1(int x)
{
	int k=x%mod;
	
	G2[k].push_back(x);
}



int find1(int x)
{
	vector<long long> :: iterator it;
	
	int k=x%mod;
	int cnt=0;
	for (it=G2[k].begin();it!=G2[k].end();++it)
		 if (*it==x)
			cnt++;
	return cnt;	 
		 
}



void sterge1(int x)
{
	int k=x%mod;
	
		
	vector<long long> :: iterator it;
	
	for (it=G2[k].begin();it!=G2[k].end();++it)
		 if (*it==x)
		 {
			 G2[k].erase(it);
			 return ;
		 }
}


int main()
{
	//my_time=clock();
	int i,j;
	freopen(file_in,"r",stdin);
		
	scanf("%d %d\n", &n, &s);
	//for (i=1;i<=n;++i)
	//{
	//	scanf("%d", &v[i]);
	//}
	
	gets(q);
	int l=strlen(q);
	
	i=0;
	n=0;
	
	while(i<l)
	{
		x=0;
		while(q[i]>='0' && q[i]<='9')
		{
			x=x*10+q[i]-'0';
			i++;
		}
		v[++n]=x;
		i++;
	}
	
	fclose(stdin);
	
	sort(v+1,v+n+1);
	
	if (n<=560)
	{	
	for (i=3;i<n;++i)
		 for (j=i+1;j<=n;++j)
			  add1(v[i]+v[j]);
	nr=0;
	for (j=2;j<n-1;++j)
	{
		for (i=1;i<j;++i)
			 nr+=find1(s-v[i]-v[j]);
		for (i=j+2;i<=n;++i)
			 sterge1(v[j+1]+v[i]);
	}
	}
	else
	{
		for (i=3;i<n;++i)
		 for (j=i+1;j<=n;++j)
			  add2(v[i]+v[j]);
	nr=0;
	for (j=2;j<n-1;++j)
	{
		for (i=1;i<j;++i)
			 nr+=find2(s-v[i]-v[j]);
		for (i=j+2;i<=n;++i)
			 sterge2(v[j+1]+v[i]);
	}
	}
	
	freopen(file_out,"w",stdout);
	
	printf("%lld\n", nr);
	//printf("%.4lf\n", (double)((double)clock()-my_time)/CLOCKS_PER_SEC);  
		
	fclose(stdout);
	
	return 0;
	
}