小红的数组

用二分寻找区间

#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;
}