intmain() { scanf("%d%d", &n, &T); for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);
while (T -- ) { int x; scanf("%d", &x);
int l = 0, r = n - 1; // 模板一 while (l < r) { int mid = l + r >> 1; // (l + r) / 2 if (q[mid] >= x) r = mid; // 找出第一个 <=x 的数 else l = mid + 1; } /* 此时 l = r */ if (q[l] != x) // 说明数组中不存在 x { puts("-1 -1"); continue; } elseprintf("%d ", l);
l = 0, r = n -1; // 模板二 while (l < r) { int mid = l + r + 1 >> 1; // 有 r = mid - 1,所以需要上取整 if (q[mid] <= x) l = mid; // 找出第一个 >=x 的数 else r = mid - 1; } printf("%d\n", l); }
signedmain() { cin >> n >> c; for (int i = 1; i <= n; i ++ ) cin >> a[i]; sort(a + 1, a + n + 1); // 使数组具有单调性 for (int i = 1; i <= n; i ++ ) { int x = a[i] + c; int l = 1, r = n; while (l < r) // 模板一 { int mid = l + r >> 1; if (a[mid] >= x) r = mid; else l = mid + 1; } if (a[l] != x) continue; // 不存在x int _r = l; // 记录左端点 l = 1, r = n; while (l < r) // 模板二 { int mid = l + r + 1>> 1; if (a[mid] <= x) l = mid; else r = mid - 1; } ans += l - _r + 1; } cout << ans << endl; return0; }
signedmain() { cin >> n >> c; for (int i = 1; i <= n; i ++ ) cin >> a[i]; sort(a + 1, a + n + 1); // 单调性 for (int i = 1; i <= n; i ++ ) ans += (upper_bound(a + 1, a + n + 1, a[i] + c) - a) - (lower_bound(a + 1, a + n + 1, a[i] + c) - a); cout << ans << endl; return0; }