Cod sursa(job #674415)

Utilizator rusu_raduRusu Radu rusu_radu Data 6 februarie 2012 10:11:56
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <cassert>
#include <vector>
#define Nmax 2000
#define Mod 699967
#define InFile "oite.in"
#define OutFile "oite.out"
#define pb push_back

using namespace std;

int n, L;
int T[Nmax];
struct Tip {int S, x, y;};
vector <Tip> H[Mod];

void read();
void precalc();
int search (int Sum);
void insert (Tip El);
void solve();

int main()
{
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  read();
  precalc();
  solve();
  return 0;
}

void read()
{
  int i;
  scanf ("%d %d\n", &n, &L);
  for (i=1; i<=n; i++)
    scanf ("%d ", &T[i]);
}

void precalc()
{
  int i, j;
  Tip el;
  for (i=1; i<n; i++)
    for (j=i+1; j<=n; j++)
    {
      el.S=T[i]+T[j]; el.x=i; el.y=j;
      insert (el);
    }
}

int search (int Sum)
{
  int i, ch=Sum%Mod, lg=H[ch].size();
  for (i=0; i<lg; i++)
    if (H[ch][i].S==Sum)
      return i;
  return -1;
}

void insert (Tip El)
{
  int ch=El.S%Mod;
  H[ch].pb (El);
}

void solve()
{
  int i, j, k, ch, pz, lg, S;
  long long nrsol=0;
  for (i=1; i<n; i++)
    for (j=i+1; j<=n; j++)
    {
      S=L-T[i]-T[j];
      if (S>0)
      {
        pz=search (S);
        if (pz!=-1)
        {
          ch=S%Mod;
          lg=H[ch].size();
          for (k=0; k<lg; k++)
            if (j<H[ch][k].x)
              nrsol++;
        }
      }
    }
  printf ("%lld\n", nrsol);
}