E
可以发现,对于某个 \(a[i]\),答案只可能是 \(a[i]\) 的约数,设其为 \(x\)。反过来想一下,若 \(x\) 能成为 \(k\) 个数的 \(gcd\),则这 \(k\) 个数都是 \(a[i]\) 的倍数。因此,\(a[i]\) 的约数 \(x\) 可以在原数组中挑出 \(k\) 个数,使 \(gcd\) 为 \(x\) 的充要条件为:\(a[i]\) 中含有 \(>=k\) 个 \(x\) 的倍数。
由于数据范围不大(\(a[i]<=1e6\)),因此可以直接暴力处理出每个数的 约数 和 倍数数量(调和级数复杂度),然后对每个数的所有约数做判断,取满足条件的最大值作为答案即可。
复杂度\(O(VlogV)\)
关于预处理 \([1,n]\) 的约数,倍数的复杂度:
- 直接枚举某个数的所有约数,是 \(O(n\sqrt n)\) 的。
- 在调和级数过程中构建倍数与约数之间关系,是 \(O(nlogn)\)的。并且注意按顺序放入数的大小也是从小到大的,因此每个数构建出的约数表天然有序,不需要再重新排列。
code
F
值域树状数组维护前缀\(max\) + 离散化 + 离线查询
将所有 \(a[i]\) 与 询问中的 \(X_{i}\) 离散化,并构建值域树状数组维护以每个数字结尾的子序列的最长严格上升子序列长度。
考虑前缀 \(a[1到i]\)时,可以直接得到以任意数 \(X\) 结尾的最长严格上升子序列长度为:
其中当前的树状数组维护了前缀 \(a[1到i]\) 的所有信息。显然,每处理某个前缀 \(R_{i}\),就可以得到以任意数 \(X_{i}\) 结尾的答案(上式)。因此不难想到将所有询问按前缀结尾升序排序,在 \(O(n)\) 遍历序列过程中动态维护 在当前的前缀下 以任意数结尾的 最长严格上升子序列的长度。具体细节见代码。
code