Cod sursa(job #3040043)

Utilizator OrzaSERBANSerban Orza OrzaSERBAN Data 29 martie 2023 11:35:17
Problema Oite Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("oite.in");
ofstream g("oite.out");

int n,m;
long long nr;
int p;
struct hashh
{
    vector<int>a,nr;
}h[366019];
int v[1027];
int esteDeja(int val)
{
    int k=val%p;
    int i,z=h[k].a.size();
    for(i=0;i<z;i++)
        if(h[k].a[i]==val)
        return i;
    return -1;
}
void hashAdd(int val)
{
    int j=esteDeja(val),k=val%p;
    if(j==-1)
    {
        h[k].a.push_back(val);
        h[k].nr.push_back(1);
    }
    else
        h[k].nr[j]++;

}
void sterge(int val)
{
    int k=val%p;
    int i,z=h[k].a.size();
    for(i=0;i<z;i++)
        if(h[k].a[i]==val)
    {
        if(h[k].nr[i]>1)
            h[k].nr[i]--;
        else
        {
            h[k].a.erase(h[k].a.begin()+i);
            h[k].a.erase(h[k].nr.begin()+i);
        }
        return;
    }
}
int cb(int st,int dr,int val)
{
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[mij]==val)
            return mij;
        if(v[mij]<val)
            st=mij+1;
        else
            dr=mij-1;
    }
    return st;
}
int main()
{
    int t,i,j,x,m,M,st,dr,k,z,val;
    f>>n>>val;
    for(i=1;i<=n;i++)
        f>>v[i];
    sort(v+1,v+n+1);
    for(i=1;i<n;i++)
        for(j=i+1;j<n;j++)
            if(v[i]+v[j]<val)
            {
                for(k=j+1;k<n;k++)
                {
                    z=v[i]+v[j]+v[k];
                    if(z<val)
                    {
                        t=cb(k+1,n,val-z);
                        if(t>0 and v[t]==val-z)
                        {
                            nr++;
                            //g<<i<<" "<<j<<" "<<k<<" "<<t<<'\n';
                        }
                    }
                    else
                        break;
                }
            }
          //  else
              //  break;
    g<<nr;
    return 0;
}