Pagini recente » Cod sursa (job #2212845) | Cod sursa (job #1666945) | Cod sursa (job #115621) | Cod sursa (job #2885753) | Cod sursa (job #31889)
Cod sursa(job #31889)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1050;
int N, S, x[MAXN];
struct sum { int a, b, sum; } s[MAXN * MAXN];
int nr[MAXN];
int cmp(sum a, sum b) { return a.sum < b.sum; }
void update(int poz, int val)
{
for (poz++; poz; poz -= (poz ^ (poz - 1)) & poz)
nr[poz] += val;
}
int query(int poz)
{
int rez = 0;
for (poz++; poz < MAXN; poz += (poz ^ (poz - 1)) & poz)
rez += nr[poz];
return rez;
}
int main()
{
freopen("oite.in", "rt", stdin);
freopen("oite.out", "wt", stdout);
scanf("%d %d", &N, &S);
int i, j, M = -1; long long NR = 0;
for (i = 0; i < N; i++)
scanf("%d", x + i);
sort(x, x + N);
for (i = 0; i < N; i++)
for (j = i + 1; j < N; j++)
{
s[++M].a = i;
s[M].b = j;
s[M].sum = x[i] + x[j];
}
sort(s, s + M + 1, cmp);
j = M;
for (i = 0; i <= M; i++)
{
if (i == 0 || s[i].sum != s[i - 1].sum)
{
if (j < 0) break;
memset(nr, 0, sizeof(nr));
for (; j >= 0 && s[i].sum + s[j].sum > S; j--);
for (; j >= 0 && s[i].sum + s[j].sum == S; j--)
{
update(s[j].a, 1);
}
}
NR += query( s[i].b + 1 );
}
printf("%lld\n", NR);
return 0;
}