Cod sursa(job #997172)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 septembrie 2013 14:19:43
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <utility>
#include <vector>

using namespace std;

#define mod 66013
vector<pair<int,int> > hash_t[mod];

vector<pair<int,int> >::iterator find(int x)
{
    int b=x%mod;
    vector<pair<int,int> >::iterator it;
    for(it=hash_t[b].begin();it!=hash_t[b].end();it++)
       if((it->first)==x)
          break;
    return it;    
}

inline int count(int x)
{
    if(x<0)
       return 0;
    int b=x%mod;
    vector<pair<int,int> >::iterator it;
    for(it=hash_t[b].begin();it!=hash_t[b].end();it++)
       if((it->first)==x)
          return (it->second);
    return 0;    
}

inline void add(int x)
{ 
    int b=x%mod;
    vector<pair<int,int> >::iterator it=find(x);
    if(it!=hash_t[b].end())
      (it->second)++;
    else
      hash_t[b].push_back(make_pair(x,1)); 
}

int main()
{
    freopen("oite.in","r",stdin);
    freopen("oite.out","w",stdout);
    
    int n=0,l,rasp=0,sum,v[1029],i,j,k;
    scanf("%d%d",&n,&l);
    
    for(i=0;i<n;i++)
       scanf("%d",&v[i]);
       
    for(i=n-1;i>=0;i--)
    {
       for(j=0;j<i;j++)
       { 
          sum=l-v[i]-v[j];
          rasp+=(count(sum));
       }
       for(k=i+1;k<n;k++)
          add(v[i]+v[k]);
    }
    
    printf("%d\n",rasp);
    return 0;
}