Cod sursa(job #1517781)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 4 noiembrie 2015 20:27:13
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <fstream>
#include <vector>
#define MOD 666013
using namespace std;
ifstream f("oite.in");
ofstream g("oite.out");
vector <pair<int,int> > V[MOD],V2[MOD];
int C,L;
int Array[1030];
int N;
long long ans;
vector <pair<int,int> > :: iterator Find2(int value)
{
    int List=value%MOD;
    vector <int>:: iterator it;
    for(auto it=V2[List].begin();it!=V2[List].end();it++)
    {
        if(it->first==value)
            return it;
    }
    return V2[List].end();
}
void Insert2(int value)
{
      int List=value%MOD;
       auto it=Find2(value);
      if(it==V2[List].end())
            V2[List].push_back(make_pair(value,1));
      else
        it->second++;
}
vector <pair<int,int>  >:: iterator Find(int value)
{
    int List=value%MOD;
    vector <int>:: iterator it;
    for(auto it=V[List].begin();it!=V[List].end();it++)
    {
        if(it->first==value)
            return it;
    }
    return V[List].end();
}
void Insert(int value)
{
      int List=value%MOD;
      auto it=Find(value);
      if(it==V[List].end())
            V[List].push_back(make_pair(value,1));
      else
        it->second++;
}
void Delete(int value)
{
    int List=value%MOD;
     auto it=Find(value);
     if(it->second>1)
    it->second--;
    else
        V[List].erase(it);
}
void Read()
{
    f>>C>>L;
    for(int i=1;i<=C;i++)
    {
        f>>Array[i];
        Insert2(Array[i]);
    }

}

void Solve()
{
     for(int i=1;i<=C;i++)
        for(int j=i+1;j<=C;j++)
        {
            int s=Array[i]+Array[j];
            Insert(s);

        }
    for(int i=1;i<=C;i++)
        for(int j=i+1;j<=C;j++)
        {
            int s=Array[i]+Array[j];
            /*if(s>L/2)
                continue;*/
            if(s>L)
                continue;
            int List=(L-s)%MOD;
            if(Find(L-s)==V[List].end())
                continue;
            int aux=Find(L-s)->second;
            if(L-s-Array[i]>=0)
            {
                int point=(L-s-Array[i])%MOD;
                auto it=Find2(L-s-Array[i]);
                if(it!=V2[point].end())
                {
                    aux-=it->second;
                    if(L-s-Array[i]==Array[i])
                        ++aux;
                }

            }
            if(L-s-Array[j]>=0)
            {
                int point=(L-s-Array[j])%MOD;
                auto it=Find2(L-s-Array[j]);
                if(it!=V2[point].end())
                {
                    aux-=it->second;
                    if(L-s-Array[j]==Array[j])
                        ++aux;
                }

            }
            if(L-s==s)
                ++aux;
            if(aux!=0)
            {
                int a;
                a=0;
            }
            ans+=aux;
        }
}
int main()
{
    Read();
    Solve();
    g<<ans/6<<"\n";
    return 0;
}