双指针
题目要找下标对之和在L~R之间的的情况,那就先找出小于L的情况,再找出小于等于R的情况,最后答案就是小于等于R的情况 - 小于L的情况。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 2e5 + 9;
ll a[maxn];
int main()
{
int n;
ll l, r; cin >> n >> l >> r;
for (int i = 1; i <= n; i++) cin >> a[i];
sort (a + 1, a + n + 1);
ll ans = 0, cnt = 0;
int i = 1, j = n;
while (i < j) {
if (a[i] + a[j] >= l) j--;
else if (a[i] + a[j] < l) {
cnt += j - i;
i++;
}
}
i = 1;
j = n;
while (i < j) {
if (a[i] + a[j] > r) j--;
else if (a[i] + a[j] <= r) {
ans += j - i;
i++;
}
}
ans -= cnt;
cout << ans;
return 0;
}