给定一个大小为 n 的序列 a,以及两个参数 op1,op2,q 次给定区间 [l,r],求 [l,r] 中 f(a[x],a[y]) 的最值,其中 l≤x,y≤r,若 op1=1 则求最小值,否则最大值。
f(i,j) 表示 i≤j 时,⊕k=ijk,若 op2=0,则该符号表示异或和,若为 1 则为或和,否则为与和。
强制在线。
值域为 106。
以上 6 种问题的做法是否有较好做法。
下述认为 n,q 同阶。
当然或和与按位反转之后等价。
令 O(k) 表示算任意两个数上述的贡献的复杂度。
在值域较小的情况下,显然有 ST 表预处理后的 O(1) 查询。
若值域较大,我的朋友说可以 O(logV) 算,在 long long 范围内可以分段打表做到 O(1)。
我们现在已有:求或和最大值/与最小值,O(n(logn+k)),这种等价于查询区间最小值最大值得贡献。
或和最小值/与和最大值:贡献只会在值域相邻点对取得,可以做到 O(nkn)。
异或最小值/最大值,由于这道题难以使用排序后异或最小值在相邻取到的结论,所以目前能做到的都是 O(nnlogV)。
相关题目:Link
均是由上面这道题扩展出来的。