At刷题计划?(upd:2023.2.28)
At刷题计划?
ARC105F
集合幂级数科技板题
直接计算二分图并不好做,于是先计算双色图的个数
记一般双色图的集合幂级数为\(F\),记连通双色图的集合幂级数为\(G\),
再记连通二分图的集合幂级数为\(H\),并定义乘法为子集卷积
所以\(G=2H,\exp G=F,H=\frac{1}{2}\ln F\)
现在只要求出\(F\),然后集合幂\(\ln\)就可以了
对于\(F\),我们可以先枚举点集\(T\),并钦定一部分为黑色,补集为白色
记\(w(T)\)为子集\(T\)在原图中含有的边数,所以\(F(T)=\sum_{P\cap Q=\emptyset ,P\cup Q=T}2^{w(T)-w(P)-w(Q)}\)
于是可以先把\(2^{w(T)}\)提出来,再对里面做子集卷积,总复杂度\(O(n^22^n)\)
ARC112E
很有意思的题
考虑对一些数的最后一次操作,假设\(l\)个移到前面,\(r\)个移到后面
那么\(a_{l+1}\cdots a_{r-1}\)必须是递增的,因为这些数没被操作过
然后可以拿斯特林数算一算
ARC119E
令\(sum\)为初始的答案
写出翻转一个区间的柿子
我们可以把\((a_l,a_{l-1})\)看成平面上的一个点,其权值为\(-|a_l-a_{l-1}|\)
于是我们要最小化一对点的权值与曼哈顿距离的和
可以双关键字排序,然后线段树维护\(y\)轴上的答案
ARC120F1
太喵了
肯定是要计算经过某个位置的选择方案数
如果这个数对于每个位置都相同就会很好算
这启发我们下一步的构造
可以发现,如果我们把\(1\)和\(n\)接起来变成环,那么每个位置的答案就是一样的了
但是发现会少算\(1\)和\(n\)同时选的方案数
进一步思考,可以发现这是递归定义的
记\(S(l,r,k)\)表示\(a_{l-r}\)这一段,选\(k\)个的答案,令\(len=r-l+1\)
记\(f(i,j)\)表示长为\(i\)的序列上,在限制下选出\(j\)个的答案
可以\(O(n)\)计算
ARC121D
我们认为选择单个就是和\(0\)组合在一起
那么最优的组合就是最小+最大,次小+次大……
证明:
考虑\(A\le B\le C\le D\)
那么\(\max(A+D,B+C)\le \max(A+C,B+D)\)
同时\(\min(A+D,B+C)\ge \min(A+C,B+D)\)
证毕
所以可以枚举往数组中加入的\(0\)的个数,也就是单个选,复杂度\(O(n^2)\)
ARC121E
我是容斥菜狗
设\(f_{i,j}\)表示以\(i\)为根的子树中,钦定了\(j\)个连向祖先
转移不难,注意这里先不管钦定点以外点的排列顺序
然后答案等于\(\sum_{i=0}^nf_{1,i}(-1)^i(n-i)!\)
用点树上背包的技巧就做完了
ARC122E
从末尾开始往前填
那么当前能填的数的相对顺序一定无影响
于是随便找一个就行了
ARC123D
首先差分后容易发现
\(A_i-A_{i-1}\le B_i-B_{i-1}\)
所以有\(B_i\ge B_{i-1}+max(0,A_i-A_{i-1})\)
这里因为要求递增,所以和\(0\)取\(max\)
然后可以直接三分
然后就是转化成一个求中位数的问题
ARC123E
首先考虑缩小我们的查询范围
令\(f(x)=a_x+\frac{x}{b_x},g(x)=a_y+\frac{x}{b_y}\)
令\(F(x)=\lfloor f(x)\rfloor,G(x)=\lfloor g(x)\rfloor\)
显然当\(f(x)<g(x)-1\)或\(f(x)>g(x)+1\)时,\(x\)一定不满足条件
再令\(mid\)满足\(f(mid)=g(mid)\)
则\(mid\)两侧\(F-G\)的绝对值一定为\(0\)或\(1\)
考虑对\(F-G\)求和,再用区间长减去,就是贡献了
于是只要解决一个形如\(\sum_iA+\lfloor\frac{i}{B}\rfloor\)的柿子,可以\(O(1)\)算
不想写,摆了
ARC124E
代数终究败给了组合意义
首先易得一定有一个位置没有传球给下一个人
所以方案数就是总方案-每个人至少传一个球的方案
然后考虑\(\prod x_i\)的组合意义,其实就是每个人从自己的球中选出一个的方案数
这个球可以从自己没有传出去的球中选,也可以从前一个人给他的球中选
于是可以设个\(dp\)解决
事实上还有更暴力的sol
直接设\(f_{i,j}\)表示第\(i\)个人给\(j\)个球的前缀积
然后钦定\(i\)前面的人必须给球,最后累加\(f_{i,0}\)
经过大力优化,用矩阵维护也可以做到\(O(n)\)
ARC125F
我们希望有一个强大的结论便于计数
具体来说,最好是合法的有序对是连续的
令\(a_i=d_i-1\),那么\(\sum a_i=n-2\)(\(a_i\)的不同的值的个数为\(O(\sqrt n)\)个)
设\(L(k)\)表示凑出\(k\)所用\(a\)的最少数的个数,\(R(k)\)表示最大
结论就是:\((c,k)\)合法当且仅当\(L(k)\le c\le R(k)\)
证明:
设\(0\)的个数为\(z\),那么\([L(k),L(k)+z]\)显然合法,\([R(k)-z,R(k)]\)同理
于是原命题等价于\(L(k)+z\ge R(k)-z-1\)即\(R(k)-L(k)\le 2z+1\)
而\(y-x\)相当于每个物品权为\(a_i-1\),所以\(y-x\in[-z,z-2]\)
所以\(k-L(k),k-R(k)\)也在区间中,故得证
于是现在直接做单调队列优化背包就行了
ARC126E
令\(F=\sum_{i<j}|A_i-A_j|\)
假设\(A_{i}<A_{j}\),且不存在\(A_{i}<A_k<A_j\)
那么对\(A_i,A_j\)的操作,会使\(F\)恰好减少\(2x\)
否则\(F\)减去的一定大于\(2x\)
于是有\(\lim_{n\to+\infty}f(x)\le \frac{F}{2}\)
同时,我们一定可以让\(F\)趋近于\(0\)
所以不等号改为等号
随便维护一下就行了
ARC127D
很妙地运用了异或的性质
不等关系可以和异或关系转换
首先令\(C_i=A_i\oplus B_i\)
那么对于\(A_i\oplus A_j\),\(B_i\oplus B_j\),它们第一位不同的地方就是\(C_i\oplus C_j\)的最高位
于是我们对\(C_i\),建\(Trie\),然后在树上算答案
可以发现当枚举到某一位不同时,可以快速算答案
具体地,只用维护\(A,B\)在这一位的四种情况的各个二进制位
于是就是\(O(N\log^2A)\)的了
ARC127E
难点在于猜结论(确信
显然是要判定是否能删除某个集合
可以感受到,从小往大删,尽量靠后是比较优的
具体实现就是从后往前扫
如果\(X_i=2\)就给计数器加\(1\)
如果\(X_i=1\),若此时计数器大于\(0\),就减去\(1\),并在这里标记为要插入删除的数的位置
剩下的\(dp\)是简单的
ARC128D
可以发现交替的段是独立的
因为两段交替段的相交位置肯定可以随便删,而两边的删除互不影响
于是我们对一个交替段进行\(dp\)
可能要分讨一下交替段的左/右端放了什么
没写,先摆了
ARC129C
可以考虑直接用\(7777\cdots 7\)的连续段去拆分
一段长为\(n\)的贡献是\(\frac{n(n+1)}{2}\)
也就是说每次会递减至\(\sqrt{n}\),即段数是不多的
所以我们直接构造,每次给之前的余数乘\(3\),再判一判就好了
ARC130D
首先很容易发现只有两种大小关系
我们上树形\(dp\)
对于枚举的当前点,它和所有儿子的关系都是一样的
所以我们可以先在儿子的\(dp\)中找到它们的相对位置关系
然后钦定当前点的位置,再插进去
设\(f_{u,i}\)表示\(u\)在它的子树构成的排列中排第\(i\)位
那么我们可以通过枚举儿子选出多少个放在\(u\)的前面/后面
写出柿子发现有个卷积 我直接写了个带优化的\(O(n^3)\)艹过去了
ARC132D
可以用反证法(也许 每个\(1\)一定是处在和他相对应的\(1\)构成的区间中的
于是我们可以贪心,也就是要让\(1\)的连续段最少
将区间排序
那么一个\(1\)要么挨着放,要么放最右边(我想到这里居然还写了个\(dp\)
最后再对第一个\(1\)的位置分讨一下就行了
ARC133F
这就是组合意义吗
首先用组合意义转化成有\(n\)个硬币,初始\(i\)个朝上的概率为\(p_i\),每次随机选一个翻转
最后求正面朝上硬币的期望个数
这样的好处是可以将贡献独立开来
简单推导一下
令\(F=\sum\frac{y^{2i}}{(2i)!}=\frac{e^y+e^{-y}}{2}, G=\sum\frac{y^{2i+1}}{(2i+1)!}=\frac{e^y-e^{-y}}{2}\\\)
对于\(c_i\)也有类似的形式
第一眼看过去是分治
但是显然不用这么麻烦
直接换元令\(t=x-1\),于是就能单\(\log\)了
ARC134E
博弈还能这么玩
为了便于分析,可以把重复的元素以及\(0\)去掉
首先\(S=\{1\}\)或\(S=\{2\}\)是必败的
然后\(S\)中含有奇数是必胜的(操作\(m=2\))
现在考虑所有元素模\(4\)的结果
如果有模\(4\)为\(2\)的数,那么是必胜的(操作\(m=4\))
现在再考虑对\(3\)取模的结果
可以发现只有两种情况:
1.\(S=\{4,8\}\)(这是必败的)
2.所有元素都是\(3\)的倍数
可以发现,我们只需要对所有数为\(12\)的倍数算答案,可以记搜
ARC135D
可以发现对于第\(i\)行,\(\sum_{j=1}^m(-1)^{i+j}a_{i,j}\)不变,列同理
故我们得到了一个必要条件
显然我们可以逐位确定,所以这是一个充要条件
然后贪一贪算一算就做完了
ARC135E
打个表观察一下
发现\(\frac{a_i}{i}\)形成了一些等差数列
大胆猜等差数列个数不会太多(官方证明为\(O(X^{\frac{1}{3}})\)个)
于是可以二分写写柿子出位置,然后这一段的贡献可以用公式\(O(1)\)算
复杂度未知
ARC135F
第一步是设\(f(i)\)表示操作一次后\(i\)上的数,即\(f(i)=\lfloor\frac{3i+1}{2}\rfloor\)
并设\(f^k(x)=f^{k-1}(f(x))\)
当\(k\)比较大的时候,直接用这个暴力,复杂度就是\(O(nk(\frac 2 3)^k)\)
当\(k\)比较小的时候,我们需要另辟蹊径
观察出\(f^k(n+2^k)=f^k(n)+3^k\),可以归纳证明
于是\(f^k(n+i2^k)=f^k(n)+i3^k\)
然后我们考虑折半,令\(x=\lfloor\frac{k}{2}\rfloor,y=k-x\),那么\(f^k(n)=f^y(f^x(n))\)
然后我们可以枚举\(i\mod 2^x\)的值
接下来就倍增+记忆化,那么这部分复杂度就是\(O((k+\log n)2^{\frac{k}{2}})\)
ARC137F
事实上,我们不关心随机出来的值是什么,我们只需要知道大小关系
所以可以将坐标离散下来
然后转化为有\(n\)个\(+1\),\(n\)个\(-1\),任意时刻前缀和\(\ge 0\)且\(\le k\)
然后要将\(+1\)和\(-1\)配对
我们假设\(n\)个\(+1\)的位置的前缀和为\(x_1,x_2\cdots x_n\)
于是有如下条件:
1.\(x_i\in[1,k]\)
2.\(x_i\le x_{i-1}+1\)
3.\(x_1=1\)
条件2可以写出\(dp\)形式,然后矩阵优化
如果选择对条件\(2\)容斥的话,就是\(O(n\log n+k\log^2k)\)
可以用OEIS做到\(O(n\log n)\)
ARC139C
奇妙构造题
考虑\(x+3y,3x+y\)什么时候会增加\(1\)
即\((i,j)->(i,j+1),(i+1,j),(i+2,j+1),(i+1,j-2)\)
于是可以构造许多\(3*3\)的矩形接在一起
在\(n=m\)且为偶数时,可以证明达到上界\(4(n-1)\)
否则可以证明达到上界\(3n+m-3\)(假设\(n<m\))
ARC140D
对树和环分讨,然后拆贡献
对一棵树单独考虑,发现可以分治\(NTT\),于是做完了
ARC140F
这种题也能放F???
恰好\(k\)个位置肯定是不好做的,考虑二项式反演
按\(i\%m\)分组,每个组内相当于选连续段
用\(x\)计数序列长度,\(y\)计数连续段个数
对于一个\(>1\)的段,可以对其翻转
于是可以以写出
如果对其提取\([x^t]\)
就得到了
是一个经典的分治问题
每次形如给区间左边乘一个\(y\)的次幂,给右边乘一个\(1+2y+y^2\)的次幂
最后再做一下差卷积就行了
ARC141D
这个题最重要的在于\(A\)的范围
可以看到上界是\(2M\),而我们要选出的集合大小为\(M\)
这启发我们先把\(2\)的因子提出来
所以将每个数写成\(2^ab\),对于一个\(b\),我们只会在所有对应\(a\)中选一个
同时,我们对于所有的\(b\)会恰好选择一个(因为上界的缘故)
顺着这个思路往下,可以观察到,对于\(2^{a_1}b_1\)和\(2^{a_2}b_2\)
如果\(b_2|b_1\),那么有\(a_2>a_1\)
于是我们可以从最小的\(b\)开始选,得出每个\(b\)对应的上界
反过来从最大的\(b\)开始,就可以得出每个\(b\)对应的下界
最后只要判断是否在上下界中就可以了
ARC143D
先把二分图的形式画出来
发现就是让所有环按顺序遍历
直接dfs一遍就行了
ARC144D
脑袋秀逗做了3h。。。
首先我们有递推的思想,确定了前\(2^i\)个数,现在要确定前\(2^{i+1}\)个数
我们令\(1a\)表示\(a+2^{i}\),那么有
也就是说,我们要给前\(2^i\)个数全部加上一个相同的数
令第\(i\)次操作加上的为\(x_i\),\(a=\sum [x_i<0]x_i,b=\sum [x_i>0]x_i\)
于是有\(0\le f(0)+a,f(0)+b\le k\),即\(-a\le f(0)\le k-b\)
变成算\(b-a\le k\),即\(\sum |x_i|\le k\)
拿个GF算一算就行了
ARC146C
考虑增量
我们现在需要往当前集合\(T\)中加数
那么就需要算出有多少数是不能放的
也就是\(T\)中所有大小为奇数的子集的异或和
这个方案是\(2^{|T|-1}\)
验证一下会不会重:
设两个不同的大小为奇数的子集为\(S1,S2\)
若\(S1,S2\)中没有相同的数,且\(S1\oplus S2=0\),那么由于\(|S1|+|S2|\)是偶数,矛盾
若\(S1,S2\)中有相同的数,就把这些数去掉,此时\(|S1|+|S2|\)仍然是偶数,矛盾
然后\(dp\)随便算一算就行了
ARC146D
比较神秘的题
将条件转化一下
变成\([[A_{P_i}<X_i]=[A_{Q_i}<Y_i]]\and[[A_{P_i}<X_i+1]=[A_{Q_i}<Y_i+1]]\)
然后令初始序列为\(1\),然后根据上面的条件不停调整
事实上可以说明(可能),这种调整在有解时一定最优,且调整顺序无关
于是可以写个类似spfa的东西跑一跑
ARC147D
裂开了
你考虑这么一件事,就是说,用\(x_2\cdots x_n,s_1\),表示出所有的集合
\(x\)即相邻集合中,恰好存在于其中一个的那个数,这样显然是一一对应的
由于是算总贡献,所以再做一些观察
设\(A_i\)表示\(S_1\)包含\(i\)时,包含\(i\)的集合数,设\(B_i\)表示\(S_1\)不包含\(i\)时的
因为有\(A_i+B_i=N\)(一定存在一种“互补”的方案),所以这一部分的贡献是\(N^M\)
然后\(x_2\cdots x_n\)的贡献就是\(M^{N-1}\),乘起来就是答案
ARC148E
静下心来做还是不难的
把数分为\(<\frac k2\)和\(\ge\frac k2\)两类
小数往右扫,大数往左移
每次可以认为是在一些数的间隙中插入数
假设原空隙数为\(S\)
当插入\(t\)个大数时,乘上\(\binom{S+t-1}{t}\),\(S\)变为\(S+t\)
当插入\(t\)个小数时,乘上\(\binom{S}{t}\),\(S\)变为\(S-t\)
ARC149D
一个重要的观察是:\(x\)和\(-x\)的答案互为相反数
于是我们维护一个连续的区间,以及区间左端点的坐标
每次如果出现区间中有数达到原点,就把它删除
然后比较左右两段长度,将小的一段向大的那段连边,即连边的两个点的答案互为相反数
再将小的那段删除
最后从根开始搜一下就行了
ARC150D
期望套路题
有一个很常用的技巧:
当前全集的权为\(S\),子集的权为\(P\)
那么在子集中随机等价于在全集中随机,若选到不是子集的就重新随机
证明:
考虑对于一个元素\(A\)
情况\(1\):显然有\(P(A)=\frac{w_A}{P}\)
情况\(2\):\(P(A)=\frac{w_A}{S}+\frac{S-P}{S}P(A)=\frac{w_A}{P}\)(即要么打中,要么在补集中且重新选)
本题中,设\(E(X_i)\)表示把\(i\)染黑的期望次数,则\(Ans=\sum E(X_i)\)
根据结论,我们可以进行几步转化:
1.对于每个点只保留链
2.不考虑在bad点中随机的限制
于是对于长为\(n\)的链就是\(\sum_{i=1}^n\frac{1}{i}\)
ARC154D
小清新交互题
可以考虑一个找\(1\)的过程
如果\(P_i+P_i\le P_x\),就令\(x\gets i\)
然后观察到所有数互不相同,所以\(a+1>b\)就可以看成\(a>b\)
于是直接把询问放进sort的cmp里面就可以了
ARC154E
不难发现\(f(P)=\sum i(i-P_i)\)
然后我们考虑\(i\)在一次操作后变成\(j\)的方案数
也就是\(\min(i,j,n-i+1,n-j+1)\)
把\(j\)替换成\(n-j+1\)结果一样,也就是具有对称性
于是只要被操作,期望就是\(\frac{n+1}{2}\)
否则就是原来的位置
然后随便算一算就行了
ARC154F
Binomial Sums的套路
首先做个Min-Max容斥
可以得到
因为要算\(k\)次方和,所以把\(x\)换成\(e^x\)
于是有
直接看成对\(e^x\)的复合是做不了的
但是我们知道,只要去掉常数项就可以复合了
于是令
现在只需求\(P(e^x)\)
再转成OGF,于是就是算\(\sum_{i=0}^m\frac{p_i}{1-ix}\)
于是只需做两个分治NTT,一次差卷积
ARC155F
给一个好想不好写的做法,参考EI做法
首先令一条边的权为\(x_i+x_j\),建完全图
然后写出其拉普拉斯矩阵,要算的就是求行列式后的\(\prod_{i=1}^nx_i^{D_i}\)这一项
然后可以利用矩阵行列式引理
令原矩阵为\(D+AB^{\text{T}}\),\(D\)是对角矩阵
\(A\)的第一列为\(x_i\),第二列为\(-1\),\(B^{\text{T}}\)的第一行为\(-1\),第二行为\(x_i\)
令\(s=\sum_{i=1}^{n-1}x_i\)
经过大力推导,得到了
以第一项为例,可以变成
也就是快速计算
后面的都是类似的
ARC156F
先考虑另一个问题
假设每个\(i\)可以选择不向集合加入数,那么可以源点向第一组限制连边,第二组限制向汇点连
然后各自的限制向对应的数连(对数拆点)
那么最大流就是答案
一个nb的结论就是:
这个问题的答案就是原问题的答案
通过画图可以发现,每次增广如果选择最短的增广路,一定不会使已经选择的限制退流
所以可以先全部选\(A_i\)构造出残量网络,然后一直增广
由于dinic每次选最短的增广,所以直接上板子就行了
AGC005F
远古F好水
首先把子树大小贡献转化成每个点的贡献
然后再容斥,设一个点连出去的连通块大小为\(s_1,s_2\cdots s_c\)
则方案数为\(\binom{n}{k}-\binom{s_1}{k}-\binom{s_2}{k}\cdots \binom{s_c}{k}\)
将所有这些联通块大小求出来,记为\(a_i\)
于是对于一个\(k\),我们要快速算出\(\sum \binom{a_i}{k}\)
构造多项式,即\(f(x)=\sum(x+1)^{a_i}\)
于是可以考虑计算\(f(x-1)\),这一步是容易的
然后就是多项式平移,一次差卷积就可以了
AGC013D
首先可以发现,盒子中的总球数是保持不变的
于是可以设\(f_{i,j}\)表示前\(i\)次操作执行完,盒子中有\(j\)个黑球的方案数
那么当\(j>0\)时,可以转移到\(f_{i+1,j-1},f_{i+1,j}\)
当\(j<n\)时,可以转移到\(f_{i+1,j},f_{i+1,j+1}\)
考虑如何去重
把黑球数想象成一条折线
在折线往上/下移动的同时(即序列同时加上或减去一个数),我们可以得到相同的序列
而球数有\(\ge 0\)的下界,所以计数最小值为\(0\)的黑球数序列就一定可以不重不漏地计数
随便加一维放进\(dp\)状态里面就行了
AGC019E
不算特别难的图论建模
把上下同时为\(1\)的称为\(A\)类点,上\(1\)下\(0\)的为\(B\)类点,上\(0\)下\(1\)的为\(C\)类点
同时在排列中钦定上面向下面连边
则边有四种\(A->A,A->C,B->A,B->C\)
对应的图有两种:
1.\(BAC\)形成的链,其中\(A\)的个数任意,且链恰有\(|B|\)条
2.\(A\)形成的环
可以发现的是,环不会对前后两个序列是否相等产生影响
于是我们思考链的排列方式有多少种
事实上,链的操作顺序只会是从尾至头,否则这个链会断开来,\(0\)就不会交换到\(B\)的位置
所以假设一条链有\(x\)个\(A\),\(A\)的排列方式就是\(x!\)
然后可以计数了
枚举有多少个\(A\)类点放进了链中
跳过有限步得到\(|A|!|B|!(|A|+|B|)!\sum_{p=0}^{|A|}[x^p](\frac{e^x-1}{x})^{|B|}\)
暴力一点就\(O(n^2)\)算答案,也可以NTT做到\(O(n\log n)\)
AGC023E
发现自己并不擅长读入量大于\(O(1)\)的计数
首先考虑一个简单的问题,怎么在这个限制条件下算排列数
按照\(a\)从小到大放,然后第\(i\)个会有\(i-1\)个的占位
令\(a_i\)的排名为\(b_i\),于是就是\(S=\prod a_i-b_i+1\)
然后套路拆贡献,假设有一组\(i<j,a_i<a_j\)
贡献为\(\frac{(a_i-b_i)S}{2(a_j-b_j+1)}\prod_{k=b_i+1}^{b_j-1}\frac{a_k-b_k}{a_k-b_k+1}\)
反过来可以容斥,也是类似的
接下来只需用线段树维护全局乘,单点改
AGC027D
先考虑如果是允许整除怎么做
那么先黑白染色
然后黑点选不同的质数,白点为四周黑点的\(\text{lcm}\)
但是这样算出来的数太大了
所以考虑让一些黑点有公因数
于是可以想到对每条斜线乘上不同的质数
显然这样仍满足每个数不同
由于最终答案不能为整除的,所以只要再给白点\(+1\)就行了
AGC028F1
感觉不难但就是没想到,读完题解有种醍醐灌顶的感觉
考虑一个点\((i,j)\),令其能走到第\(k\)行最左端的为\(L_{k,i,j}\),最右为\(R_{k,i,j}\)
最理想的情况就是\(L-R\)中的点都能走到,那么直接前缀和算一算就行了
但是我们会出现一个格子,上边和左边是障碍物
那么其左上角的所有格子都走不到它
可以发现的是
我们在倒序扫的过程中,只要把这种情况一点点向外扩展然后暴力改前缀和就行了
AGC031E
可以直接单纯形
可以考虑费用流
以条件一为例,不妨转化为排名\(>b_i\)的数都\(>a_i\)
但这依然不明朗
暴力一点,直接枚举选了多少个数
实际上,我们的限制是单调的
所以就算选出来的数不是单调的,也可以交换位置
于是可以只用考虑第\(i\)个数的坐标范围
然后随便建下图跑个最大费用最大流就行了
AGC036E
考虑如果没有相邻不同的限制
那就是\(\min(cnt_A,cnt_B,cnt_C)\)
把限制加上,不妨假设\(cnt_A\le cnt_B\le cnt_C\)
先删去\(ACB,BCA\)以及开头,结尾的\(C\)
如果仍然有\(cnt_B<cnt_C\)
就删除\(AC,CA\)
最后删去\(BC,CB\)
AGC038E
首先考虑\(Min-Max\)容斥
问题变成对于所有集合,求第一次使得其中任意元素出现\(b_i\)次的期望次数
可以先写出一个组合在一起的生成函数
注意这里是\(EGF\),最后\(x^i\)项要乘\((i-1)!\)
对于连乘符号那一部分,可以先\(O(n^3)\)求出(带上\(-1\)的权)
然后枚举最后出现的数,即前面那一部分
这里可以解一个\(F(y^kG+1)=H\)的方程,总复杂度仍然是\(O(n^3)\)
令选出集合的概率和为\(S\)
考虑对于没选到集合中的数,实际上就是将\(F(x)\)变为\(F(\frac{x}{1-(1-S)x})\)
求导,代入\(x=1\)得\(F'(\frac{1}{S})\frac{1}{S^2}\),同样可以\(O(n^3)\)计算
AGC041F
容斥流
先容斥:
假设钦定了\(k\)个格子没被覆盖
那么就是\((-1)^k\)的系数,剩下的格子都有个\(2\)的贡献
但是统计剩下的格子有多少个不好做
考虑一个列集合\(S\),其中的格子均不能被覆盖
对于一个行连续段,假设长为\(len\),在\(S\)中的格子数目为\(p\)
那贡献有两种:
1.不填\(S\)中的格子,即\(2^{len-p}\)
2.填\(S\)中的格子,那么其它位置不能放車,即\(\sum_{i\ge 1}\binom{p}{i}(-1)^i=-[p>0]\)
但是发现还是会算重,因为要保证\(S\)中每一列至少填一个
仔细思考一下,这又是一个容斥能解决的问题
再容斥:
再设\(T\subset S\),容斥系数为\((-1)^{|T|}\),钦定\(T\)中的列不填
设行连续段在\(T\)中有\(q\)个,于是贡献\(2\)变为\(-[p-q>0]\)即\(-[p\not =q]\)
现在只要建笛卡尔树,然后设一个\(f_{u,p,[p=q]}\)做树形\(dp\)就行了
AGC047C
太生草了
先把每个数变成原根的次幂,然后只需要在指数上做卷积就行了
AGC058D
容斥博大精深
最初的想法是,连续段长度为\(c\),则贡献\((-1)^{c-2}\),但是不是很好算
改一下容斥方法,钦定有\(c\)个位置不合法,被钦定的限制可以形成连续段
假设连续段长为\(i\),那么\(f(i)=-(f(i-1)+f(i-2))\)
即,在\(i-2\)的位置新加一个钦定位置,然后之前的段得延伸到\(i-1\)或者\(i-2\)的位置
于是得到的系数为\(1,0,-1\)的交替
写生成函数\(\frac{1}{1-\frac{x+y+z-3xyz}{1-xyz}}\),可以\(O(n)\)计算
AGC060D
Alpha1022:这题很简单
令\(g(S)\)表示大于号集合为\(S\),\(S\)之外均为小于号的方案数
于是答案就是\(\sum_Sg_S^2\)
然后稍微做一个容斥
令\(f(S)\)表示钦定\(S\)为大于号,其它任意
于是\(g(S)=\sum_{S\subset T}(-1)^{|T|-|S|}f(T)\)
稍微推一下柿子
注意到\(|T|=n-1-\sum_{i}[i\notin T]\),于是可以理解为一个段的贡献为\(\frac{1}{2}\)
把这些只跟\(n\)有关的先提出去
于是设\(H=\frac{1}{1-(-\frac{1}{2})(e^x-1)}\),\(G[i]=H[i]^2\)
现在还需要考虑\(\sum_{i}[i\notin T_1\and i\notin T_2]\)的贡献
这些位置将原序列划分为许多段,满足每段每个位置\(i\)满足\(i\in T_1\or i\in T_2\),设每段为\(F(x)\)
通过枚举第一个\(i\notin T_1\and i\notin T_2\)的位置,得到\(G=F+FG\),于是\(F=\frac{G}{1+G}\)
答案就是\((n!)^22^n[x^n]\frac{1}{1-2F}\)(这里变成了\(2^n\)是因为\(n\)和\(n+1\)之间的符号实际上并不存在)