容斥原理与Minmax容斥

@

普通容斥

容斥原理的本质是加上一堆模糊的可能取值,然后不断逼近真取值

也就是有一些只满足一部分条件的答案被多/少统计了,容斥原理可以处理此类问题

容斥原理由两部分构成,容斥系数和容斥统计的状态

用数学表达式来统计:

\[\sum_{T \subset S}^{|T|\le|S|} f(T)*w(T) \]

\(f(T)\) 要考虑把一些东西消掉,常用的有\(-1^{|T|}\)或者\(-1^{|T|-1}\)

\(w(T)\) 即为T状态对答案的贡献

怎么用容斥解题呢?

  1. 列出题目中所有条件,对每个条件分别求解
  2. 如上,考虑出现重复
  3. 于是枚举\(2^n\)个集合,相似的集合可以合并求解
  4. 贡献乘上容斥系数,求\(\sum\)

是⑧是很浅显?

例题选讲

欧拉函数

求1~n之间与n互质的数的个数

我们定义状态集合为包含几个因子

显然地,答案为\(n - \sum_x (gcd(n,x)\neq 1)\)

因为是第一个例题就详细理解一下吧

首先,答案一定包含于所有因子\(\le n\)的倍数中

而这些因子又有重复的

于是考虑把为同时两个因子的倍数减掉

那么又多减了同时为三个因子的倍数,要加上

然后类似地递归,数学归纳得到容斥的公式

枚举每个因⼦放与不放 ——apiadu

经典题目

N个变量xi,每个变量满⾜\(0\le xi\le Ci\)
\(\sum x=A\)的解的数量

然后考虑没有限制的时候怎么放

跟隔板法差不多,就是把A看成A个小球,求分割方案数

显然是\(C(A+1,N)\)

然后考虑钦定 \(K\) 个数,这些数的第i个必须\(\geq C_i\)

也挺好做的,先把A减去\(C_i\)就跟无限制一样了

这样是\(2^n\)

好像还有第二档

因为某些原因鸽了(2019/7/30 要打CFdiv2(探底)于是没去答疑

QQ上问了杜老师还没回就先这样

SetAndSet

把n个数分成两个集合使得结果一样

分析一下?

结果一样必然二进制下每一位都一样

则套上容斥,对于每个条件考虑反面:所有1在一边,另一边全是0 或者没有

对于每一位同是1的连一条边,对于处理的K个数取出查看有多少个连通块

如果不符合条件的话,至少有一个连通块的数在一起

这是此时总方案数就是\(2^{连通块数}\)

然后外面再乘一个其他数随便分配的组合数就好了

ZJOI2016 小星星

n个点的树,求一个排列p,使树上有(u,v)的边,图里有(pu,pv)的边

出现=无限制-没有出现

全都没有限制\(dp[u][v]\) ->u对应v,已经求完了子树

\(dp[u][v]=\prod_{s \in son(u)} (\sum dp[s][t]*w[v][t])\)

\(w[v][t]\) 表示\(v\)\(t\)在图上是否连通

解释一下,只在图上联通的儿子才加上它的dp值

有限制不能出现就把边删掉(开个vis)

复杂度\(2^n*n^3\) 空间\(O(n^2)\)

经典问题

把k分解成若干因数的乘积,因子有顺序求方案数

读入方式:\(n=p_1^{e_1}+p_2^{e_2}+p_3^{e_3}+...+p_m^{e_m}\)

\(\sum e_i \leq 1e5\)

看完题后直觉:不是沙雕dp吗?

dp做不了的。。

其实是容斥然后类似隔板法一样的来求方案数

固定\(i\)个因子为1

答案为\(\sum _{i=0} ^{m-1} ans_i*f(i)\) ,ans为固定i个为1的方案数,f是容斥系数

\(i\) 个1除掉之后的方案数,其他数没有限制的方案数就好算了啊QwQ

方案数等于\(C(k,i) * \prod _{j=1} ^m C(e_j+k-i-1,k-i-1)\)

即枚举k里选哪\(i\)个不是1,组合数求方案

经典问题2

给出全集大小,每次产生子集S的概率为P(S),求期望步数

容斥与期望结合

由于期望的线性性,容斥完取期望等于期望的容斥

考虑对每个子集T计算不止所有T的子集在T内的期望,那么要把重复的消掉

对于每个元素T,套路地使它在偶数时被消掉,奇数时加上(这个可以举几个例子来判断容斥系数,我比较菜所以不会推

然后枚举子集容斥就可以了

\[E(S)=\sum _{T \subsetneqq S} \frac{(-1)^{|S|-|T|-1}}{1-P'(T)} \]

如上,\(P'(T)\)表示所有子集都在\(T\)内的概率,运用上一篇博客里的公式得到期望

Minmax 容斥

结论

\(Max(S)=\sum_{T \in S} Min(T) * f(i)\)

其中\(f\)为 容斥系数,此处取\(-1^{|T|-1}\)

同理,对于\(Min(S)\)也成立(但是用\(Max\)的情况较多

证明

首先证明可以取到\(Max(S)\),即对于只包含\(Max(S)\)的集合,\(Min(T)\)等于\(Max(S)\)

然后对于其他的值取最小值时,集合大小为奇数时加上,大小为偶数时减掉,而选奇数个和选偶数个的方案数又是一样的,于是抵消掉了

由期望的线性性可得,对于每个数取期望时也成立

例题选讲

simple例题

搞一个课堂上还记得的:

\(n\)道题,每道题听懂概率\(P_i\),求全部听懂次数

显然是每道题听懂期望次数的\(Max\),于是变成\(Minmax\)模板题

运用\(Minmax\)容斥可以把问题变成求一个集合中至少出现一个数的期望,就很简单了

[HAOI2015]按位或

显然为每个位置都取到1的期望步数,即为最晚的位置变成1的时间

那么\(E(Min)\)的取值就是\(\frac{1}{\sum _{g \and T≠ϕ} P[g]}\)

这个东西再套一层简单容斥然后转化成求T补集的子集,然后再用1减

这个子集前缀和就跟高维前缀和一样搞搞就行了

简单容斥——补集思想

杂题选讲

  1. 同色三角形

    完全图每条边红黑染色,求同色三角形个数

    不合法三角形:异色角/2 可以画图理解

    然后枚举每个点枚举每条边,每个点答案贡献为红边*黑边/2

    最后用C(n,3)减一下

  2. CF297E

    如果把每条线对应成一个点,若两条线交叉则在所对应的两点间连红边,否则连蓝边,那么我们就得到了一个含n个节点的完全图G。可以发现,第一种方案对应G中的一个红色三角形,第二种方案对应G中的一个蓝色三角形。

    问题就转化成纯色三角形个数就好了

    枚举一条线段,另一侧选两条

    问题转化为求一些几何图形的方案数,笔记上是第一种和第三种

    还有。。如果你不是正睿上课的同学

    无可奉告I'm angry!

  3. n点联通图计数

    总图个数 - 不连通

    令 f(n) = 连通图个数

    $f(n) = 2^{C(n,2)} - \sum _{i=1}^{n-1} C(n-1,i-1) *f(i) *2^{n-1,2} $

    欧拉图:度数都是偶数且联通

    f(n) = 总的度数为偶数的个数

    \(f(n) = 2 ^{C(n-1,2)}\)

    先把\(n-1\)个点连完,如果度数奇数就和\(n\)

    \(f(n) = 2^{C(n-1,2)} - \sum _{i=1}^{n-1} C(n-1,i-1) *f(i) *2^{C(n-i-1,2)}\)

  4. 连边 bzoj2169

    有N个点(编号1到N)组成的无向图,已经为你连了M条边。请你再连K条边,使得所有的点的度数都是偶数。求有多少种连的方法。要求你连的K条边中不能有重边

    但和已经连好的边可以重。不允许自环的存在。求连边的方法数。我们只关心它模10007的余数。

    \(f[i][j]\)为选了i条边,j个点度数为奇数

    \[f[i][j]=f[i-1][j-2]*C(n-j+2,2)+f[i-1][j]*(n-j)*j+f[i-1][j+2]*C(j+2,2)-f[i-2][j]*(C(n,2)-i+2) \]

    即分为以下情况讨论:

    1. 连两个度数为奇数的边 ,j-2

    2. 连一奇一偶,j不变

    3. 连两个偶数,j+2

    4. 减去连的重边 ,i-2选的情况和i选的情况有一部分是相同的

      最后除以\(k!\)

  5. 树的最短路径期望

    有一棵树,树的边权都是1,随机选k个点

    在上面走,最路径时间走k个点,求期望时间

    对于一条边,左右两边都有关键点,必须走两次

    然后可以减去最远的两个点的路径长(期望的线性性)

    就变成了\(\frac{C(n,k)-C(size_l,k)-C(size_r,k)}{C(n,k)}\) - \(\sum P(u,v)*w(u,v)\)

    考虑在P(u,v)在选出来的点两两路径构成的树上成为直径的概率

    如果(u,v)是直径,则有对于任意的x

    \(d(u,x)\leq (u,v)\)

    \(d(v,x)\leq d(u,v)\)

    但是有重复,考虑令u的字典序最小,不妨设\(u<v\)

    对于\(d(u,x)=d(u,v),d(v,x)<d(u,v)\),使\(x>v\)

    同理对于\(d(u,x)<d(u,v),d(v,x)=d(u,v)\),使4x>u$

    对于\(d(u,x)=d(u,v),d(v,x)=d(u,v)\),使\(x>max(u,v)\)

    这样每棵树的每条直径都只算了一次

  6. company Acquisitions

    有若干公司,每个节点可能是根节点,也可能是自己点

    每次选两个根,一个变成另一个的儿子,而它的儿子变成根

    求只有一个根的期望步数

    设计状态\(C(x)\) 为一个点为根且有i个儿子对答案的贡献

    \(C(x)+C(y)=1+1/2*(C(x+1)+y*c(0))+1/2*(C(y+1)+x*c(0))\)

    解得\(c(x)=1/2(c(x+1)+x*c(0)+1)\)

    \(c(n-1) = 0\)

  7. Segment

    随机构造一个线段树:有\((1,n)\)个线段,每次选中间一个点\(x\)(随机),然后递归下去选,直到\(l=r\)

    \(q\)次询问问区间\((l,r)\)会访问几个区间

    考虑询问\([x,y]\)\(l\leq x,r\geq y\),一定被经过

    相交的区间也一定被经过

    包含于它的区间取决于树的形态

    怎么拆后者的期望?答案是叶节点 - 包含且非叶区间个数

    问题好像就很显然了?(

    常见的转化。——apiadu

    得到答案\(=\)\((l,r)\)相交或包含$(l,r) - \(被\)(l,r)$严格包含且非叶节点 + 包含叶子个数

    定义第一类区间权值为1,第二类-1,第三类1

    用期望线性性拆开,相当于求\([x,y]\)出现的概率,乘上对应的权值(1或者-1)

    怎么求概率呢?

    考虑随机生成割开位置的排列

    则x,y 区间出现意味着x-1号隔板和y号隔板比他们中间的模板都先出现

    左右端点特殊考虑一下!

    可惜的是这题并不能\(n^2*m\)

    至于剩下考虑如何快速算出来,搞搞前缀和

    技术性细节不讲 ——apiadu

按时间分治

考虑离线,边加入和删除,可以理解为在一段时间内存在这条边

然后对时间建线段树,然后dfs时间线段树

访问到T把T所有边加入并查集

访问左右节点,访问完左节点撤销左节点操作(不能路径压缩并查集!)(要按秩合并 撤销的时候判断一下

在叶节点回答查询就可以了

后记

有用的东西:期望 = 总和 / 总方案数

下午四点之后杜教就开始放飞自我力(悲

然后我就自闭了

posted @ 2019-08-01 23:26  lcyfrog  阅读(1783)  评论(3编辑  收藏  举报