Cod sursa(job #1553537)

Utilizator pulseOvidiu Giorgi pulse Data 19 decembrie 2015 23:59:36
Problema Oite Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("oite.in");
ofstream fout("oite.out");

const int MAXN = 1025;
int N, S;
int a[MAXN];
long long ans;

void solve()
{
    sort(a + 1, a + N + 1);

    for (int i = 1; i < N; ++i)
    {
        for (int j = i + 1; j <= N; ++j)
        {
            int sum = S - a[i] - a[j];
            int l = j + 1;
            int r = N;

            while (l < r)
            {
                if (a[l] + a[r] < sum)
                    l++;
                else if (a[l] + a[r] > sum)
                    r--;
                else
                {
                    if (a[l] == a[r])
                    {
                        long long x = 1;
                        for (int k = 2; k <= r - l + 1; ++k)
                            x *= 1LL * k;
                        ans += x;
                        break;
                    }
                    else
                    {
                        long long nr1 = 0;
                        int x = a[l];
                        while (l < r && a[l] == x)
                        {
                            nr1++;
                            l++;
                        }
                        long long nr2 = 0;
                        x = a[r];
                        while (l - 1 < r && a[r] == x)
                        {
                            nr2++;
                            r--;
                        }
                        ans += nr1 * nr2;
                    }
                }
            }
        }
    }
}

void read()
{
    fin >> N >> S;
    for (int i = 1; i <= N; ++i)
        fin >> a[i];
}

int main()
{
    read();
    solve();
    fout << ans;
    return 0;
}