Pagini recente » Cod sursa (job #1797035) | Cod sursa (job #901980) | Cod sursa (job #3002068) | Cod sursa (job #2792247) | Cod sursa (job #58265)
Cod sursa(job #58265)
#include <stdio.h>
#include <algorithm>
using namespace std;
const char iname[] = "oite.in";
const char oname[] = "oite.out";
typedef long long i64;
#define MAX_N 1024
#define MAX_S 523776
int C;
int L;
int A[MAX_N];
struct entry {
int sum;
int x;
int y;
} ;
entry E[MAX_S], T[MAX_S]; int cnt;
int B[MAX_N], F[MAX_N], size;
void read_in(void)
{
scanf("%d", &C);
scanf("%d", &L);
for (int i = 0; i < C; ++ i)
scanf("%d", &A[i]);
}
void countsort(entry A[], entry B[], int n, int gr)
{
int cnt[65536] = {0};
int i;
int num;
for (i = 0; i < n; ++ i) {
num = gr ? (A[i].sum >> 16) : (A[i].sum & 65535);
cnt[num] ++;
}
for (i = 1; i < 65536; ++ i)
cnt[i] += cnt[i - 1];
for (i = n; i --; ) {
num = gr ? (A[i].sum >> 16) : (A[i].sum & 65535);
B[-- cnt[num]] = A[i];
}
}
int search(int A[], int F[], int n, int key)
{
int k;
int stp;
for (stp = 1; stp < n; stp <<= 1) ;
for (k = 0; stp; stp >>= 1) {
if (k + stp < n && A[k + stp] <= key)
k = k + stp;
}
if (A[k] == key)
return F[k];
else
return 0;
}
int main(void)
{
freopen(iname, "r", stdin);
read_in();
sort(A, A + C);
for (int i = 0; i < C; ++ i) {
if (i > 0 && A[i] != A[i - 1])
size ++;
B[size] = A[i];
F[size] ++;
}
size ++;
for (int i = 0; i < C; ++ i) {
for (int j = i + 1; j < C; ++ j) {
E[cnt].x = i;
E[cnt].y = j;
E[cnt ++].sum = A[i] + A[j];
}
}
countsort(E, T, cnt, 0);
countsort(T, E, cnt, 1);
i64 ans;
int lo, hi;
ans = 0;
lo = hi = cnt - 1;
for (int i = 0; i < cnt; ++ i) {
int sum = E[i].sum;
int x = E[i].x;
int y = E[i].y;
if (sum > L)
continue ;
if (i > 0 && E[i].sum != E[i - 1].sum)
hi = lo;
while (lo >= 0 && E[lo].sum >= L - sum)
-- lo;
while (hi >= 0 && E[hi].sum > L - sum)
-- hi;
ans += (i64)(hi - lo);
if (lo < i && i <= hi)
ans --;
ans -= (i64)(search(B, F, size, L - sum - A[x]));
if (L - sum - A[x] == A[x])
ans ++;
ans -= (i64)(search(B, F, size, L - sum - A[y]));
if (L - sum - A[y] == A[y])
ans ++;
if (L - sum - A[x] == A[y])
ans += 2;
}
freopen(oname, "w", stdout);
printf("%lld\n", ans / 6);
return 0;
}