Cod sursa(job #594129)

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

#define MAXN 1026
#define MOD 3033
#define LG 30
#define NOT -1

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

inline int find(int x){

  int key=x%MOD, i;
  for(i=0; i<LG; ++i)
    if(H[key][i].first == x)
      return i;
  
  return NOT;
}

inline void add(int x){

  int key=x%MOD, i;
  if((i=find(x)) == NOT){
    for(i=0; i<LG; ++i)
      if(!H[key][i].first)
	H[key][i]=make_pair(x,1);
  }
  else
    ++H[key][i].second;

}

inline void erase(int x){

  int key=x%MOD, i;
  if((i=find(x)) != NOT)
    --H[key][i].second;

}

inline int getcnt(int x){
  
  int key=x%MOD, i;
  for(i=0; i<LG; i++)
    if(H[key][i].first == x)
      return H[key][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;

}