二分查找解法(100+ms)
#include <cstdio>
#include <algorithm>
#define MAXN 200020
using namespace std;
int a[MAXN];
inline int read() {
int x = 0, sign = 0;
char c = getchar();
while (c < '0' || c > '9') {
if ('-' == c) {
sign = 1;
}
c = getchar();
}
while ('0' <= c && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 0x30);
c = getchar();
}
return sign ? (~x + 1) : x;
}
int main() {
int N = read();
int C = read();
long ans = 0;
for (register int i = 0; i < N; ++i) {
a[i] = read();
}
sort(a, a + N);
for (register int i = 0; i < N; ++i) {
ans += upper_bound(a, a + N, a[i] + C) - lower_bound(a, a + N, a[i] + C) ;
}
printf("%ld", ans);
return 0;
}
雙指針解法(100-ms)
#include <cstdio>
#include <algorithm>
#define MAXN 200020
using namespace std;
int a[MAXN];
inline int read() {
int x = 0, sign = 0;
char c = getchar();
while (c < '0' || c > '9') {
if ('-' == c) {
sign = 1;
}
c = getchar();
}
while ('0' <= c && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 0x30);
c = getchar();
}
return sign ? (~x + 1) : x;
}
int main() {
int N = read();
int C = read();
long ans = 0;
for (register int i = 0; i < N; ++i) {
a[i] = read();
}
sort(a, a + N);
register int lo = 0;
register int hi = 0;
for (register int i = 0; i < N; ++i) {
while (lo < N && a[lo] - a[i] < C) {
++lo;
}
while (hi < N && a[hi] - a[i] <= C) {
++hi;
}
if ((C == a[hi - 1] - a[i]) && (C == a[lo] - a[i])) {
ans += hi - lo;
}
}
printf("%ld", ans);
return 0;
}