Cod sursa(job #573860)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 6 aprilie 2011 17:01:32
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<cstdio>
#include<algorithm>
#include<vector>
#define Nmax 1025
#define M 666013
using namespace std;

int N,S,v[Nmax],val;
vector <pair <int,int> > a[M];

int cauta(int x){
	
	int hash=x%M;
	
	for(size_t i=0;i<a[hash].size();++i)
		if(a[hash][i].first == x){
			a[hash][i].second+=val;
			return i;
		}
	
	return -1;
}

void adauga(int x){
	
	val=1;
	if(cauta(x)==-1){
		int hash=x%M;
		a[hash].push_back(make_pair(x,1));
	}
}

void sterge(int x){
	
	val = 0;
	int poz=cauta(x);
	if(poz!=-1){
		int hash=x%M;		
		
		a[hash][poz].second--;
		if(a[hash][poz].second == 0)
			a[hash].erase(a[hash].begin()+poz);
	}
	
	
}

int plus(int x){
	
	int hash=x%M;
	
	for(size_t i=0;i<a[hash].size();++i)
		if(a[hash][i].first == x)
			return a[hash][i].second;
return 0;
}
int main(){
	
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	
	scanf("%d%d",&N,&S);
	
	for(int i=1;i<=N;++i)
		scanf("%d",&v[i]);
	
	sort(v+1,v+N+1);
	
	for(int i=3;i<N;++i)
		for(int j=i+1;j<=N;++j)
			adauga(v[i]+v[j]);
	
	int sol=0;
	
	for(int j=2;j<=N;++j){
		
		for(int i=1;i<j;++i)
			sol+= plus(S-v[i]-v[j]);
		
		for(int i=j+2;i<=N;++i)
			sterge(v[j+1]+v[i]);
	}
	
	printf("%d\n",sol);
return 0;
}