Cod sursa(job #594148)

Utilizator Smaug-Andrei C. Smaug- Data 6 iunie 2011 13:47:25
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <utility>
#include <string>
#include <vector>
using namespace std;

#define MAXN 1026
#define MOD 666013
#define LG 20

vector< pair<int,short> > H[MOD];

inline vector< pair<int,short> >::iterator find(int x){

  int key=x%MOD;
  vector< pair<int,short> >::iterator i;
  
  for(i=H[key].begin(); i != H[key].end(); ++i)
    if(i->first == x)
      return i;
  
  return H[key].end();
}

inline void add(int x){

  int key=x%MOD;
  vector< pair<int,short> >::iterator i;

  if((i=find(x)) == H[key].end())
    H[key].push_back(make_pair(x,1));
  else
    ++i->second;

}

inline void erase(int x){

  int key=x%MOD;
  vector< pair<int,short> >::iterator i;

  if((i=find(x)) != H[key].end())
    --i->second;

}

inline int getcnt(int x){
  
  int key=x%MOD;
  vector< pair<int,short> >::iterator i;
  
  for(i=H[key].begin(); i != H[key].end(); ++i)
    if(i->first == x)
      return i->second;
  
  return 0;

}

int main(){

  freopen("oite.in", "r", stdin);
  freopen("oite.out", "w", stdout);

  int N, L, A[MAXN], i, j, res;

  scanf("%d%d", &N, &L);
  for(i=0; i<N; ++i)
    scanf("%d", A+i);

  memset(H, 0, sizeof(H));

  for(i=2; i<N; ++i)
    for(j=i+1; j<N; ++j)
      if(A[i]+A[j] < L)
	add(A[i]+A[j]);

  res=0;
  for(i=1; i<N-2; ++i){
    for(j=0; j<i; ++j)
      if(A[i]+A[j] < L)
	res+=getcnt(L-A[i]-A[j]);

    for(j=i+2; j<N; ++j)
      if(A[i+1]+A[j] < L)
	erase(A[i+1]+A[j]);
  }

  printf("%d\n", res);
  
  return 0;

}