Min-Max 容斥
一种关于 min,max 的容斥。
公式:
max(S)=∑T⊆S,T≠∅(−1)|T|+1min(S)(1)
min(S),max(S) 分别表示 S 中的最大值和最小值。
证明:考虑枚举每个元素作为最小中的贡献(如果有多个值相同的数再再按下标比较)
那么小于当前元素的数不能选。假设有 k 个大于当前元素的数,则有式子:
k∑i=0(ki)(−1)i=(−1+1)k=0k
也就是说只有最大值才会有 1 的贡献。
这个式子在期望意义下依旧满足,根据期望的线性性那么有:
E(max(S))=∑T⊆S,T≠∅(−1)|T|+1E(min(T))(2)
扩展式子:
kthmax(S)=∑T⊆S,|T|≥k(−1)|T|−k(|T|−1k−1)min(T)(3)
证明类似,还是枚举每个元素作为最小元素所在的贡献。
设当前元素 x 从大到小排名为 p ,p<k 时贡献为 0。
否则枚举 T 的大小。
p∑i=k(−1)i−k(p−1i−1)(i−1k−1)=p∑i=k(−1)i−k(p−1k−1)(c−ki−k)=(p−1k−1)p−k∑i=0(−1)i(p−ki)=(p−1k−1)0p−k
只有元素 x 恰好是第 k 大的时候才会有 1 的贡献。
板子题,使用形式二转化为求集合 T 至少一个位置 1 的期望步数。
相当于求的是所有子集和,再套一个 FMT 板子即可。
题目求得是第 k 小元素出现的期望时间,等价于求第 n+1−k 大元素出现的期望时间。接下所有的 k 都是转化后的。
使用形式三转化为求集合 T 中出现第一个元素的期望时间,根据期望的线性性,转步数为: ∑w∈Tmpw,那么有:
E(kthmax(S))=∑T⊆S(|T|−1k−1)(−1)|T|−k∑w∈Tmpw
自然想到一个一个加物品。这种容斥式子的一个经典优化方式是直接将一部分记录为权值,把不好转移的放下标上。
设 fi,j,k 表示前 i 个数中选的所有数的 pw=j,第 k 大值的 (|T|−1k−1)(−1)|T|−k 的和是多少。
如果不选当前的数有转移 fi,j,k=fi−1,j,k。
否则选的话,会出现新的系数,比较难处理,考虑:
(|T|−1k−1)(−1)|T|−k=((|T|−2k−1)+(|T|−2k−2))(−1)|T|−k=−((|T|−1)−1k−1)(−1)(|T|−1)−k+((|T|−1)−1(k−1)−1)(−1)(|T|−1)−(k−1)
你会发现前面一坨的系数等于 fi−1,j−pi,k 记录的,后面一坨的系数等于 fi−1,j−pi,k−1 的,那么有:
fi,j,k=fi−1,j,k−fi−1,j−pi,k+fi−1,j−pi,k−1
滚动数组优化即可。
感觉这题出得非常好啊!改变了对 min,max 的刻板影响。
重新定义 min(S) 表示集合中第一个满足出现次数 ci≥bi 的时间,max(S) 表示最后一个,设 suma 为 a 的总和。
那么依旧可以套用形式二将本题转化为求第集合 T 中第一个满足条件的期望时间。
首先排除掉集合外元素的干扰,即期望下每 suma∑w∈T1aw 次才会选到一个集合内的元素。
然后注意到从集合内元素出现次数从 0,0,⋯0 到恰好有一个数满足 ci=bi 的过程中一共经过了 ∑w∈Tcw 个状态(最终状态不算),那在中间的每个状态做一的贡献。那么也就转化为对于每个 ∀i∈T,ci<bi 的状态,经过这里的概率。
期望转计数,那么对于一个固定状态 c,概率为:
(∑ci)!∏ci!∏(ai∑x∈Tax)ci
第一项为多重排列数,第二项表示生成 ci 个 i 的概率。
再把反演公式带入:
ans=∑T⊆S(−1)|T|+1suma∑w∈T1aw×(∑ci)!∏ci!∏(ai∑x∈Tax)ci=suma∑T⊆S(−1)|T|+1∑w∈T1aw×(∑ci)!∏ci!∏aici∏(1∑x∈Tax)∑ci
跟上面类似,将一些更多的系数记录在权值上。
设 fi,j,k 表示前 i 个数选了若干个数使得 ∑ai=j 且 ∑ci=k 的 (−1)|T|−1∏aciici! 的系数和。
转移依旧分两种,不选的话 fi,j,k=fi−1,j,k
选的话 fi,j,k=−fi−1,j−ai,k−ci×∏aciici!。
复杂度看起来是 O(n4) 的,(默认 ∑ai,∑bi,n 同阶),状态三维转移需要枚举 ci。
但是仔细一想 ci 的一共的枚举量是 ∑bi 的,摊下来就是 O(n3) 的!
依旧可以适用形式二将转化为走到集合第一次走到 T 任意一个元素的期望时间。
让出发点为树的根节点,设 fi 表示从 i 节点出发走到 T 的期望步数。
设 di 表示 i 的度数,那么有:
fi=1di(ffa+∑j∈sonifj)+1
显然 i∈T 的步数为 0。
那么可以直接高斯消元得到 f 的真实值,但是复杂度略有些爆,可能需要卡常。
注意到这题其实性质非常好,如果 f 的值只和儿子有关的话那么就可以递推了。唯一的问题就是 fa 的贡献,那么考虑设 fi 用 kiffa+bi 表示。
那么有:
fi=1di(ffa+∑j∈soni(kjfi+bj))+1difi=ffa+fi∑j∈sonikj+∑j∈sonibj(di−∑kj)fi=ffa+∑bj+difi=1di−∑kjffa+di+∑bjdi−∑kjki=1di−∑kj,bi=di+∑bjd−∑kj
现在转移就跟父亲节点无关了,一遍 DFS 即可求出所有值。
现在我们对于每个集合 T 都可以 O(n) 求出 frt 的值。
注意到:
E(max(S))=∑T∈S(−1)|T|+1E(min(T))
我们处理出 (−1)|T|+1E(min(T)) 即可。
再套上高维前缀和即可。
还是更改 min,max 的定义。
min(S) 表示每次询问的答案的最小值,max(S) 表示最大值。
套用形式二:
max(S)=∑T⊆S(−1)|T|+1min(T)
集合 T 的答案显然只和所包含的本质不同的位置个数(区间并)有关。
设 fi,j 表示 i 个数中最小值为 j 的概率,sfi,j 表示前 i 个数中最小值大于等于 j 的概率,Fi 表示区间并大小为 i 的期望。
fi,j=1n((x−j+1)fi−1,j+sfi−1,j+1)Fi=n∑j=1fi,j×j
首先如果一个区间包含另一个区间是没有任何作用的。(如果一个大的区间被选择了,那么小区间选和不选分别带来 1 和 −1 的代价,抵消了)。那把所有包含另一个区间的区间给消除掉。再按照右端点排序。
直接记录区间并略有些麻烦,考虑记补集大小,再设 gi,j,0/1 表示前 i 个区间选了若干个区间使得区间并的 补集 是 j 且选了奇数/偶数个区间。
gi,j,w=∑rp<ligp,j−(li−rp−1),w⊕1+∑rp≥ligp,j,w⊕1
注意到 l,r 分别单调递增,两坨式子分别考虑,第一坨考虑对于每个 gp,j,w 在 rp<li 的时候再加入贡献,贡献到 cj+rp,w,第二托式子考虑对于每个 gp,j,w 在算出的时候就贡献到 dj,w,在 rp<li 的时候取消贡献即可。
那么有:
gi,j,w=cj−(li−1),w⊕1+dj,w⊕1
最后再把贡献带入:
ans=q∑i=1ri∑j=0(gi,j,1−gi,j,0)F(ri−j)
一道扩展 min−max 容斥题,真的很牛牛。
令 Vp(n) 表示最大的 k,满足 pk∣n。
对于所有质因子 p,设 vp(ai) 中的最小值和次小值(不要求严格)为 xp,yp,那么答案为 ∏ppxp+yp,注意到操作都是跟 lcm 有关,也就是跟 vp(ai) 的最大值有关。套上 min−max 容斥有:
gcdi≠j(Ai×Aj)=∏T⊆Slcm(T)(−1)|T|−1(∏T⊆Slcm(T)(−1)|T|−2(|T|−1))=∏T⊆Slcm(T)(−1)|T|(|T|−2)
这个其实应该是先对每个因子做 min−max 容斥,然后再相乘。
有一个经典的结论为我们任意一个值域为 [1,106] 的集合 S,都存在一个大小为至多为 7 的子集 T 使得 gcd(T)=gcd(S)。
构造则可以任选一个数,将其最小幂次对应的数加入集合,再检查这个数能否去除即可,证明见 CF 官方题解。
我们这样选出两组数,使得答案不变,使用的子序列总长度约为 O(2k×k2),其中 2k×k 为操作次数,其中带一个 14 的常数,足以通过。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具