题目解析
对于每个查询,若直接使用循环暴力统计 [Li,Ri][L_i, R_i][Li ,Ri ] 内的奇数或偶数,时间复杂度为 O(Ri−Li)\mathrm{O}(R_i - L_i)O(Ri −Li )。本题 1≤Li≤Ri≤1091 \le L_i \le R_i \le 10^91≤Li ≤Ri ≤109。暴力统计会超出时间限制。
我们不妨思考一个问题:给定任意正整数 NNN,求 [1,N][1, N][1,N] 中所有「奇数」的数量,如何解决这个问题?
不妨枚举,打表找找规律,1,3,5,7,9,11,⋯1, 3, 5, 7, 9, 11, \cdots1,3,5,7,9,11,⋯。
分类讨论一下:
1. 当 NNN 为「奇数」时,那么显然一共有 N+12\frac{N + 1}{2}2N+1 个「奇数」;
2. 当 NNN 为「偶数」时,那么显然一共有 N2\frac{N}{2}2N 个「奇数」;
3. 由于 C++ 中整数做除法自动抹除小数,所以可以统一写成 N+12\frac{N + 1}{2}2N+1 。
那么我可以考虑使用「前缀和」的思想,计算出 [1,Li−1][1, L_i - 1][1,Li −1] 中「奇数」的数量 odd(Li−1)odd(L_i - 1)odd(Li −1) 和 [1,Ri][1, R_i][1,Ri ] 中「奇数」的数量 odd(Ri)odd(R_i)odd(Ri ),那么 [Li,Ri][L_i, R_i][Li ,Ri ] 中「奇数」的数量为 odd(Ri)−odd(Li−1)odd(R_i) - odd(L_i - 1)odd(Ri )−odd(Li −1)。
统计「偶数」的数量同理。
AC代码
C++ 代码:
Python 代码: