Cod sursa(job #1761539)

Utilizator antanaAntonia Boca antana Data 22 septembrie 2016 14:43:17
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <algorithm>
#define MAXN 1024
#define MAXS 524288
#define MOD ((1<<22)-1)

struct aa{
    int sum, x, y;
}val[MAXS];

int r, v[MAXN+1], lista[MOD+1], nxt[MAXS];

inline void adauga(int s, int i, int j)
{
    int mod = (s&MOD);

    val[++r].sum=s;
    val[r].x=i;
    val[r].y=j;
    nxt[r]=lista[mod];
    lista[mod]=r;
}

inline long long check(int s, int i, int j)
{
    int mod = (s&MOD), p, ans=0;
    p=lista[mod];

    while(p)
    {
        if(val[p].sum == s && val[p].x > j && val[p].y > j)
            ans++;
        p=nxt[p];
    }

    return ans;
}

int main()
{
    freopen("oite.in", "r", stdin);
    freopen("oite.out", "w", stdout);

    int n, i, j, l;
    long long ans=0;

    scanf("%d%d", &n, &l);

    for(i=0;i<n;++i)
        scanf("%d", &v[i]);

    std::sort(v, v+n);

    for(i=0;i<n-1;++i)
        for(j=i+1;j<n;++j)
            adauga(v[i]+v[j], i, j);

    for(i=0;i<n-1;++i)
        for(j=i+1;j<n;++j)
            if(v[i] + v[j] <= l)
                ans += check(l - (v[i] + v[j]), i, j);

    printf("%lld", ans);
    return 0;
}