BISHI85 【模板】整数域二分¶
简单通过率 63.19%python3样例通过牛客 AC
一句话
静态数组,q 次询问区间 [l, r] 内的元素个数。
解题思路¶
这题考什么¶
整数域二分(lower_bound / upper_bound)的最标准模板:
先把数组排好序,此后每次询问都是 O(log n)。 两个边界写法(第一个 >= x、第一个 > x)见 44-二分。
数据规模与复杂度¶
n, q <= 2e5。排序 O(n log n),询问 O(q log n),总计约 2e5 * 18 * 2 ≈ 7e6。 暴力每次扫一遍是 4e10,必然 TLE。
Python 的坑¶
- 手写二分(Python 层的 while 循环)大约要 2e5 * 18 = 360 万次迭代, 而 bisect 模块是 C 实现,快一个数量级,直接用 bisect 就是最优解;
- 输入 4e5+ 个整数,必须 sys.stdin.buffer.read().split() 一次读完; 逐行 input() 会慢十几倍;
- 输出 q 行,"
".join 一次性写出;
- 题面没有保证 l <= r。若真出现 l > r,两个 bisect 相减会是负数, 所以外面套一个 max(0, ...) 兜底。
参考实现¶
[:octicons-arrow-left-16: BISHI84](BISHI84.md) [BISHI86 :octicons-arrow-right-16:](BISHI86.md)