小红的数组
用二分寻找区间
#include <string>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
#define ll long long
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
using namespace std;
const int maxn = 100000 + 10;
const int INF = 2 * int(1e9) + 10;
int n;
ll a[300001];
ll k;
int main() {
ll ans1 = 0, ans2 = 0, ans3 = 0;
scanf("%d %lld", &n, &k);
for (int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
sort(a + 1, a + n + 1);
for (int i = 1; i < n; ++i) {
ll l = lower_bound(a + i + 1, a + n + 1, 1.0 * k / a[i]) - a;
ll r = upper_bound(a + i + 1, a + n + 1, 1.0 * k / a[i]) - a;
if (l == n + 1) {
ans1 += n - i;
} else {
ans1 += l - i - 1;
ans3 += n - r + 1;
ans2 += r - l;
}
}
printf("%lld %lld %lld", ans3, ans2, ans1);
return 0;
}