Cod sursa(job #396390)

Utilizator freak93Adrian Budau freak93 Data 15 februarie 2010 08:27:48
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream>
#include<algorithm>

using namespace std;

const char iname[]="oite.in";
const char oname[]="oite.out";
const int mod=22307;
const int maxn=2024;

ifstream f(iname);
ofstream g(oname);

int i,j,n,k,a[maxn],l;

long long rez;

struct nod
{
    int v;
    int w;
    nod *next;
    nod(){v=w=0;next=0;};
}* h[mod];

void insert(int x)
{
    int l=x%mod;
    nod *k;
    for(k=h[l];k&&k->v!=x;k=k->next);
    if(k)
    {
        ++k->w;
        return;
    }
    k=new nod;
    k->v=x;
    k->w=1;
    k->next=h[l];
    h[l]=k;
}

int many(int x)
{
    int l=x%mod;
    nod *k;
    for(k=h[l];k&&k->v!=x;k=k->next);
    if(k)
        return k->w;
    return 0;
}

void drop(int x)
{
    int l=x%mod;
    if(h[l]==0)
        return;
    nod *k;
    if(h[l]->v==x)
        if(h[l]->w==1)
        {
            k=h[l];
            h[l]=h[l]->next;
            delete k;
            return;
        }
        else
        {
            --h[l]->w;
            return;
        }

    for(k=h[l];k->next&&k->next->v!=x;k=k->next);
    if(k->next)
        if(k->next->w==1)
        {
            nod *r=k->next;
            k->next=r->next;
            delete r;
        }
        else
            --k->next->w;
}

int main()
{
    f>>n>>l;
    for(i=0;i<n;++i)
        f>>a[i];
    sort(a,a+n);

    for(i=2;i<n;++i)
        for(j=i+1;j<n;++j)
            insert(a[i]+a[j]);

    for(i=1;i<n;++i)
    {
        for(j=0;j<i;++j)
            rez+=many(l-a[i]-a[j]);
        for(j=i+2;j<n;++j)
            drop(a[i+1]+a[j]);
    }

    g<<rez<<"\n";
}