ABC 392 (EF)

E

可以发现,对于某个 a[i],答案只可能是 a[i] 的约数,设其为 x。反过来想一下,若 x 能成为 k 个数的 gcd,则这 k 个数都是 a[i] 的倍数。因此,a[i] 的约数 x 可以在原数组中挑出 k 个数,使 gcdx 的充要条件为:a[i] 中含有 >=kx 的倍数。

由于数据范围不大(a[i]<=1e6),因此可以直接暴力处理出每个数的 约数 和 倍数数量(调和级数复杂度),然后对每个数的所有约数做判断,取满足条件的最大值作为答案即可。

复杂度O(VlogV)

关于预处理 [1,n] 的约数,倍数的复杂度:

  1. 直接枚举某个数的所有约数,是 O(nn) 的。
  2. 在调和级数过程中构建倍数与约数之间关系,是 O(nlogn)的。并且注意按顺序放入数的大小也是从小到大的,因此每个数构建出的约数表天然有序,不需要再重新排列。

code

F

值域树状数组维护前缀max + 离散化 + 离线查询

将所有 a[i] 与 询问中的 Xi 离散化,并构建值域树状数组维护以每个数字结尾的子序列的最长严格上升子序列长度。

考虑前缀 a[1i]时,可以直接得到以任意数 X 结尾的最长严格上升子序列长度为:

bit.querymax(mp[X])

其中当前的树状数组维护了前缀 a[1i] 的所有信息。显然,每处理某个前缀 Ri,就可以得到以任意数 Xi 结尾的答案(上式)。因此不难想到将所有询问按前缀结尾升序排序,在 O(n) 遍历序列过程中动态维护 在当前的前缀下 以任意数结尾的 最长严格上升子序列的长度。具体细节见代码。

code

posted @   jxs123  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
主题色彩