Pagini recente » Cod sursa (job #2154161) | Cod sursa (job #1968448) | Cod sursa (job #955718) | Cod sursa (job #3153583) | Cod sursa (job #1377884)
#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;
}