
二分查找解法(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;
}

本文介绍了洛谷P1102问题的两种高效解法,包括使用二分查找法在100毫秒以上的复杂度下解决问题,以及利用双指针法在100毫秒以内实现解决方案。这两种算法在解决数对问题上展现了不同的思路和效率。
712

被折叠的 条评论
为什么被折叠?



