Cod sursa(job #674401)

Utilizator rusu_raduRusu Radu rusu_radu Data 6 februarie 2012 10:00:37
Problema Oite Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <cassert>
#include <vector>
#define Nmax 1030
#define Mod 100003
#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, nrsol=0, ch, pz, lg, S;
  for (i=1; i<n; i++)
    for (j=i+1; j<=n; j++)
    {
      S=L-T[i]-T[j];
      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 ("%d\n", nrsol);
}