LeetCode 第52场双周赛总结
前三题没什么好说的都是模拟。
向下取整数对和
说一下我的思路:先对数组进行排序,依次枚举除数 y y y,然后枚举商 d d d,对整个数组进行二分分块,统计符合条件的$x的数量即可。
官方题解:
设 C C C为数组中的最大值,同样枚举 y y y和 d d d, y y y枚举 [ 1 , C ] [1,C] [1,C], d d d枚举 [ 1 , ⌊ C y ⌋ ] [1,\lfloor \frac{C}{y} \rfloor] [1,⌊yC⌋],之后,我们统计符合条件的 x x x的个数,记 c n t [ x ] cnt[x] cnt[x]为元素 x x x出现的个数,那么满足条件的 x x x的个数为:
∑ x = d y min { C , ( d + 1 ) y − 1 } c n t [ x ] \sum_{x = dy}^{\min\{C,(d+1)y-1\}} cnt[x] x=dy∑min{C,(d+1)y−1}cnt[x]
其中对 c n t [ x ] cnt[x] cnt[x]求和是连续的,因此我们可以用 p s u m [ x ] psum[x] psum[x]表示 c n t [ x ] cnt[x] cnt[x]的前缀和进行优化。
因此,该式就变成了:
p s u m [ min { C , ( d + 1 ) y − 1 } ] − p s u m [ d y − 1 ] psum[\min\{C,(d+1)y-1\}] - psum[dy - 1] psum[min{C,(d+1)y−1}]−psum[dy−1]
然后乘以 d ∗ c n t [ y ] d * cnt[y] d∗cnt[y]即可 。
这篇博客回顾了LeetCode第52场双周赛,重点讨论了模拟和数学问题的解决策略。博主分享了对于向下取整数对和问题的解题思路,包括先排序、枚举除数和商,以及使用二分分块和前缀和优化算法,提高了求解效率。官方题解也采用了类似的方法,通过枚举和统计符合条件的元素个数来求解。
7万+

被折叠的 条评论
为什么被折叠?



