[Gym 102770L]List of Products 题解

简要题意#

pi 为从小到大第 i 个质数,并记 vp(n) 为正整数 n 中质因子 p 的最高次幂( pn 则为 0 )。现在对于两个正整数 x,y,重新定义它们的大小关系:

  • x=y ,则认为 xy 相等。
  • 否则,找到最小的正整数 i 使得 vpi(x)vpi(y),若 vpi(x)<vpi(y) 则认为 x 较小,否则认为 y 较小。

现在给出两个长度分别为 n,m 的正整数序列 a,b ,求将所有 ai×bj 按上述规则从小到大排列后第 k 个数。

n,m105,2ai,bi106,1kn×m

原题链接

题解#

V 为值域大小,下述 “<” 均表示题目中定义的小于关系。

首先,考虑对于两个整数 x,y ,如何尽快比较他们的大小。由于值域不大,我们可以通过预处理筛出每个正整数的最小质因子,来做到 O(logV) 的分解质因数,这样就可以在 O(logV) 的时间内比较值域内任意两个数大小(值域内任意两个数的积是类似的)。

题目所求是第 k 大,所以自然想到二分。假如已经确定 L<ans<Rans 为答案),那么如何表示出 ans 的可能取值呢?尝试枚举 i,寻找哪些 j 满足 L<ai×bj<R 。这时候,可以发现一个关键的性质:如果有 a<b,c<d,那么就有 ac<bd(这是因为对于任意质数 pvp(ac)=vp(a)+vp(c),vp(bd)=vp(b)+vp(d) )。

所以,我们可以先对 a,b 两个序列分别按照题目规则排序。这样,对于固定的 i,满足 L<ai×bj<Rj 一定是一段连续的下标区间 [lbi,rbi] 。而且如果 i<j ,那么 lbilbj,rbirbj(这里的“”是通常实数上的大小关系)。这样,就可以通过双指针加上 O(logV) 的大小比较,O(nlogV) 的时间内找出每个 ilbi,rbi

接下来,我们要选取二分的检验值。像通常一样取区间中点显然不好办到,但是我们可以在所有 i=1nrbilbi+1 个可能的乘积中随机找一个。因为在区间 [l,r] 内随机一个值,期望为 l+r2 ,所以区间长度也会期望变成原来的一半,那么二分的期望时间复杂度就可以保证。这样,我们每次在可能的乘积中随机一个,然后通过双指针处理出它对应的排名区间(因为可能有相同的数),如果可以是第 k 个,就得到答案,否则更新 L,R ,期望二分次数是 O(log(nm))

总复杂度 O((n+m)log(nm)logV) (其实二分部分和排序部分的复杂度是相当的)。

作者:Esofar

出处:https://www.cnblogs.com/complexor/p/17590757.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   complexor  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示