Cod sursa(job #1377884)

Utilizator GeorgianBaditaBadita Marin-Georgian GeorgianBadita Data 6 martie 2015 08:57:03
Problema Oite Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <algorithm>

#define DIM 1024
#define DIMM 1000005 + 1024
#define infile "oite.in"
#define outfile "oite.out"

using namespace std;

int n, s, v[DIM], i, j, k, x, c, p, u, m;
long long sol;

struct suma {
    int x;
    int s;
} a[DIMM];

inline bool cmp(const suma &a, const suma &b) {

    return (a.s == b.s ? a.x < b.x : a.s < b.s);

}

int main() {

    freopen (infile, "r", stdin);
    freopen (outfile, "w", stdout);

    scanf("%d%d", &n, &s);
    for (int i = 0; i < n; ++i)
        scanf("%d", &v[i]);
    sort(v+0, v+n);
    for(i=0; i<n; i++)
        for(j=i+1; j<n; j++)
        {
            k++;
            a[k].s=v[i]+v[j];
            a[k].x=i*1000+j;
        }
    sort(a+1, a+k+1, cmp);
    for(i=1; i<=k; i++)
    {
        x=s-a[i].s;
        c=(a[i].x%1000+1)*1000;
        p=1;
        u=k;
        while(p<=u)
        {
            m=(p+u)>>1;
            if(a[m].s==x)
            {
                if(a[m].x>=c)
                    u = m-1;
                else
                    p = m + 1;

                continue;
            }
            if (a[m].s < x)
                p = m + 1;
            else
                u = m - 1;

        }
        int p1 = p;

        x=s-a[i].s;
        c=(a[i].x%1000)*1000;
        p=1;
        u=k;
        while(p<=u)
        {
            m=(p+u)>>1;
            if (a[m].s <= x)
                p = m + 1;
            else
                u = m - 1;

        }

        int p2 = u;

        sol += std::max(0, p2 - p1 + 1);


    }
    printf("%d\n", sol);
    return 0;
}