Tokio Marine & Nichido Fire Insurance Programming Contest 2020 English

D

设阈值(L),预处理(ile L)的祖先最优背包
对于一次询问,(i>L)的部分可以状压

E

显然,题目可以直接转化为(S=0,T=2^L-1)(A_iin[0,2^T))
(f(U))为集合大小(in[1,K]),集合中所有数(And U)相同的个数
(ans=sumlimits_{U}(-1)^{popcount(U)}f(U))

证明:
考虑对于集合大小(in[1,K])的集合,被统计了几次
这时(f(U)的意义可以描述成:)U$中的位上为(1)时是否集合上该位相同,剩下的比较显然了

考虑如何计算(f(U)),枚举每个(U),然后(O(N))遍历(a_i)
(O(2^LN))

没有用到任何高级算法,非常巧妙!!

令一种稍劣的方法
(S=0,T=2^L-1)的意义在于,选择的集合每一位出现过(0)(1)
固定集合内的一个元素,然后要做的事就变成:找到一个集合,使得集合中的位出现过某个数字,可以通过fwt配合容斥解决

具体来说,现在的问题可以描述成选择一个集合,其与为(0)
(f(U))(a_iAnd U=U)的个数,令(g(i)=sumlimits_{j=0}^{k-1}{ichoose j})(sumlimits_{U}(-1)^{popcount(U)}g(f(U)))
证明同上

(O(ncdot L2^L))

F

不失一般性地,我们来统计((0,i),(j,0)(W,k)(ile k))
(d=k-i)

由毕克定理,三角形内部点数(A),边界上点数(B),三角形面积(S),有

[2S=2A+B-2 ]

整理

[egin{aligned} &(2i+d)W−ij−(W−j)(i+d)=2A+(i,j)+(W,d)+(W−j,i+d)−2\ &iW−(i,j)−(W−j,i+d)=2A+(W,d)−2−dj\ end{aligned}]

需要计算三元组((i,j,d))的个数,其满足:(iW−(i,j)−(W−j,i+d)le 2K+(W,d)−2−dj)
固定((j,d)),右侧是定值,令其为(R)
由于((i,j)+(W−j,i+d)le W),当(ile frac{R}{W})时恒满足,(ige frac{R}{W}+1)时恒不满足
仅需格外计算(i=frac{R}{W}+1)即可

((j,d))使得(Rge 0)的个数(O((K+W)log(K+W)))

原文地址:https://www.cnblogs.com/Grice/p/13199865.html