Cod sursa(job #997098)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 septembrie 2013 12:58:21
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <utility>
#include <list>

using namespace std;

#define mod 666013
list<pair<int,int> > hash_t[mod];
list<pair<int,int> > hash_mic[mod];

list<pair<int,int> >::iterator find_t(int x)
{
    int b=x%mod;
    list<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;
    list<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;
    list<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)); 
}

////////////////////////////////
list<pair<int,int> >::iterator find(int x)
{
    int b=x%mod;
    list<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;
    list<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;
    list<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()
{
    ifstream cin("oite.in");
    ofstream cout("oite.out");
    
    int n=0,l,rasp=0,sum,v[1029],i,j;
    cin>>n>>l;
    for(i=0;i<n;i++)
    {
       cin>>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));
          //cout<<"crestem cu "<<count_t(sum)<<' '<<sum<<endl;
          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++;
       }
    cout<<rasp/6<<'\n';
    cin.close();
    cout.close();
    //system("PAUSE");
    return 0;
}