Cod sursa(job #997114)

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

using namespace std;

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

vector<pair<int,int> >::iterator find_t(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;    
}

int count_t(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;    
}

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

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

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

void add(int x)
{ 
    int b=x%mod;
    vector<pair<int,int> >::iterator it=find(x);
    if(it!=hash_mic[b].end())
      (it->second)++;
    else
      hash_mic[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;
    scanf("%d%d",&n,&l);
    for(i=0;i<n;i++)
    {
       scanf("%d",&v[i]);
       add(v[i]);
    }
    for(i=0;i<n;i++)
       for(j=i+1;j<n;j++)
          add_t(v[i]+v[j]);
    for(i=0;i<n;i++)
       for(j=i+1;j<n;j++)
       { 
          sum=l-v[i]-v[j];
          rasp+=(count_t(sum));
          rasp-=(count(sum-v[i]));
          rasp-=(count(sum-v[j]));
          if((v[i]+v[j])==sum)
             rasp++;
          if(v[i]==(sum-v[i]))
             rasp++;
          if(v[j]==(sum-v[j]))
             rasp++;
       }
    printf("%d\n",(rasp>>1)/3);
    return 0;
}