真·浅谈高维前缀和/sosdp

  • 1041 字
  1. 1. 高维前缀和/sosdp
  2. 2. 题目
    1. 2.1. ARC100E Or Plus Max
    2. 2.2. CF1208F Bits And Pieces
    3. 2.3. P6442 [COCI2011-2012#6] KOŠARE
    4. 2.4. CF449D Jzzhu and Numbers

夜空是否全然知晓?

高维前缀和/sosdp

计算高维前缀和可以不用容斥,而是对每一维分别做前缀和,复杂度为 O(kn)O(kn),其中 kk 是维度。

对于子集求和问题,相当于二进制下的 11 可以选 001100 只能选 00,类似于一个高维的前缀和问题。

那么就可以在 O(n2n)O(n 2^n) 的复杂度之内求出类似于子集和的问题。

题目

ARC100E Or Plus Max

ik,jki \in k,j \in kij=ki | j = k 的必要条件,是 ij<=ki|j<=k 的充分条件。

先算出 =k=k 的答案,在求个前缀最小值就算出了 k\leq k 的答案,然后也满足了充要。

然后就是求子集最大值和次大值,高维前缀和解决。

CF1208F Bits And Pieces

考虑枚举一个 ii,然后 di(dj&dk)=di+(di&dj&dk)d_i|(d_j \& d_k)=d_i+(d_i \& d_j \& d_k)

要使得 di&dj&dkd_i \& d_j \& d_k 更大,从高位到低位贪心的看能不能是 11

假设当前选择的为 ss,首先 disd_i \in s,然后存在 j,kj,k 使得 i<j<ki < j < k 并且 djs,dksd_j \in s,d_k \in s

相当于求一个超集的最大值和次大值,这种类似子集和的问题可以用高维前缀和解决。

P6442 [COCI2011-2012#6] KOŠARE

设选择的集合为 ssfsf_ss\in s 的个数,那么集合 s\in s 的个数为 2fs12^{f_s}-1

fsf_s 可以用高维前缀和算,然后按照 11 的个数容斥就行了。

也可以再跑一遍差分。

CF449D Jzzhu and Numbers

和上一道类似,不过不是跑子集是跑超集。

然后跑容斥或者差分。