Para 好闪,拜谢 Para!Para 最好啦!
[清华集训 2014] 主旋律
abs,第一题就忘了怎么做了。
DAG 计数模板题。
这里有一个经典的 trick:不是强连通分量的总会存在缩点后度数为 \(0\) 的点。但是不好直接做,考虑容斥。容斥系数当然是 \((-1)^{cnt}\) 其中 \(cnt\) 是钦定的度数为 \(0\) 的点的个数。
发现确定构成度数为 \(0\) 的点的点集后系数是确定的:\(2^{e_{S-T}}\times 2^{e_{(S-T,T)}}\),所以容斥部分可以预处理:
令 \(mul_S\) 表示将 \(S\) 划分为若干个独立的强联通块的方案数,带上容斥系数。\(dp_S\) 代表 \(S\) 构成一个完整强连通的方案数。
根据定义转移 \(dp_S\) 的时候 \(mul_S\) 不能加上 \(dp_S\) 的贡献,所以可以先算 \(mul_S\),转移完 \(dp_S\) 后再加上去。
进行一个排的重
印象深刻,被蓝题刺杀的一集,现在再看好像也比较自然了。
首先发现 \(f(a)_{\max}\) 必定是 \(n\) 加最长上升子序列长度。因为贡献为 \(2\) 的位置至多就只有最长上升子序列的长度个,其余位置都是 \(1\) 的贡献。
那么方案数怎么求呢?首先发现确定了贡献为 \(2\) 的位置后其余点能填在哪两个之间也是确定的,所以倒着转移就行。
[APIO2016] 划艇
现在来看算是比较简单的题了。
首先显然离散化,分成 \(\text O(n)\) 段,容易想到 \(dp_{i,j}\) 表示用前 \(i\) 个学校填满了前 \(j\) 段,从 \(dp_{l,j-1}\) 转移即可。此时问题出在学校可以不参加比赛,我们不能暴力枚举参加的学校的数量,那样复杂度会达到 \(\text O(n^4)\)。
求的其实是 \(n\) 个数填到 \([0,m]\) 的值域中,所有非 \(0\) 数单调递增的方案,这个其实可以直接用 \(\binom{n+m}{m}\) 表示,组合意义容易思考,啊实际上这就是范德蒙恒等式。
[CF838D] Airplane Arrangements
每日三黑噩梦生活的开端,在金佛山上写的。
考虑转化一下不合法即有人无法落座的情况:将长度为 \(n\) 的序列扩充成长度为 \(n+1\) 的环,一旦最终环上有人则不合法。又因为环上每个点都是等价的,所以合法的概率为 \(\frac{n-m+1}{n+1}\),乘上总方案数即可。
真的会有人不看题解就想得出来吗?太强了。
十二重计数法
这是个啥???
哦,原来是盒子与球。
懒得写了,该复习的时候滚回去再想一遍就行。
象棋世界
实际上只有象和王比较难。
象:
先判掉无解和一步到达的情况。
然后最短步数显然是要贴着边跳,枚举初始跳跃方向,二分步数,然后进行调整。
发现每将一个拐点往中间平移一个单位终点就会向上平移两个单位,插板法即可,实现有点难受。
王:
\(R\) 较大,考虑矩阵转移,但是这样会达到 \(\text O(C^3\log R)\) 的级别,需要优化。
\(A\) 表示转移矩阵,这里给出三个性质:
- \(A^n_{i,j}=A^n_{j,i}(1\le i,j \le C)\)。
- \(A^n_{i,j}=A^n_{C-i+1,C-j+1}(1\le i,j \le C)\)
- \(A^n_{i,j}=A^n_{i - 1,j - 1}+A^n_{1,i+j-1}(1\le i+j-1\le C)\)
如果满足这三个条件那么我们只需要知道矩阵的第一行与第一列即可求出矩阵,前两个正确性显然,主要难点在第三个。
考虑归纳法,考虑第一维为 \(2\):
因为 \(A^{n+1}_{1,i}=A^{n+1}_{i,1}\),所以 \(A^n_{1,i-1}+A^n_{1,i}+A^n_{1,i+1}=A^n_{i, 1}+A^n_{i,2}\),得 \(A^n_{2,i}=A^n_{1,i-1}+A^n_{1,i+1}\)。
接着归纳第一维大于 \(2\):
因为 \(A^{n+1}_{k,i}=A^{n+1}_{i,k}\),所以 \(A^n_{k,i-1}+A^n_{k,i}+A^n_{k,i+1}=A^n_{i,k-1}+A^n_{i,k}+A^n_{i,k+1}\),因此 \(A^n_{k,i-1}+A^n_{k,i+1}=A^n_{i,k-1}+A^n_{i,k+1}\)。
因为 \(A^n_{k,i+1}=A^n_{k-1,i}+A^n_{1,i+k}\),所以 \(A^n_{k+1,i}=A^n_{1,i+k}+A^n_{k,i-1}\)。
好像是有更直接的反射容斥的做法,但是孩子的多项式是个大大大坑,所以先摆在这里有空再填吧。
[AGC039E] Pairing Points
重做一遍好像还是想不出来……
关键问题在于状态设计即子问题划分方法。
初步思考发现这东西是初始一条边,接着有许多跨越这条边两端的边,每个边的两端各对应着一个区间,在该区间内继续划分。发现只有第一条边要考虑两个端点,所以直接钦定第一条边连了 \(1\) 号点,令 \(dp_{l,r,i}\) 表示处理 \([l,r]\) 这个区间并且其中 \(i\) 号节点是连向了区间外部的那个点的方案数。
转移也有点讲究,枚举最外侧的一条边覆盖的两个区间 \([l,L],[R,r]\),然后缩成 \(dp_{L+1,R-1,i}\) 继续做,加一点优化就很容易达到 \(\text O(n^6)\),带个 \(\frac{1}{720}\) 的常数,随便过。
[AGC036F] Square Constraints
神题。
这个问题相当于是在半径为 \(n\) 和 \(2n\) 的 \(\frac{1}{4}\) 环中间摆 \(2n\) 个车使其互不攻击的方案数。
这种东西一般都要构造出来某种神秘的偏序关系使得前面的可选范围一定被后面的包含,然后就能直接做减法。
两个环中间夹着十分不好做,考虑没有里面的那个环,那么此时显然从最短的也就是 \(2n\) 开始做是符合上面的思想的。
比较容易想到容斥,钦定以小扇形为上界的点的数量 \(k\),令小半圆在 \(i\) 处值为 \(L_i\),大扇形为 \(R_i\)。
怎么处理呢?这里 有一个非常奇妙的写法:将 \([1,n]\) 的以 \(L_i\) 为第一关键字,\((n,2n]\) 的以 \(R_i\) 为第二关键字。你可以发现这样完美契合我们最初提出的那个思想,也就是所有钦定的 \(L_i\) 一定可以影响到比它大的 \((n,2n]\) 的 \(R_i\),令 \(dp_{i,j}\) 表示这样排序后转移到第 \(i\) 个点,钦定了 \(j\) 个以 \(L\) 为上界的方案数。
此时再想想你就会发现选取 \(R\) 为上界的 \([1,n]\) 不好求啊。这里又有一个超牛的想法:提前计算。
发现所有以 \(L\) 为上界的和 \((n,2n]\) 中的所有点和在其之前的以 \(R\) 为上界的点都一定能影响到它,后两个比较好求,可是以 \(L\) 为上界的数此时还不知道总共有多少个啊?
仔细观察你可以发现,你现在的复杂度是 \(\text O(n^2)\),而 \(n\le 250\),因此你可以直接在 \(dp\) 外部暴力枚举钦定的上界总数 \(k\),然后直接减 \(k\) 就行。
[AGC028D] Chords
非常唐的一道题。
考虑在每个联通块的左右端点记录贡献,令 \(dp_{l,r}\) 表示区间 \([l,r]\) 全部内部连边且 \(l\) 与 \(r\) 联通。
可以使用容斥转移:
\(g_i\) 表示 \(i\) 个点两两配对的方案数,实际上是 \(1+3+\dots+i-1\),很好证。\(c(i,j)\) 表示 \([i,j]\) 中还没有被强制要求选择的点的数量。
没啦!
[AGC009E] Eternal Average
也是吃上 Firefox 了。
转化题意,发现这是个 \(k\) 叉树,有 \(n +m\) 个叶子且每个节点的值是其儿子节点的值的平均数,让你求根节点的值的可能情况数。仔细思考一下你就会发现每个叶子对根节点的贡献只取决于其深度,所以直接背包把 \(m\) 个 \(1\) 分配到 \(\frac{n+m-1}{k-1}\) 层中就行。
但是这样会算重,因为有进位,不过你只需要保证每层叶子至多有 \(k-1\) 个,然后把每个 \(x \equiv m \pmod{k-1}\) 都加到答案里就行了。
[CF850F] Rainbow Balls
严肃没有思路。
首先发现如果指定了最终剩余的球的颜色那么其余的颜色都是等价的,因此如果令 \(f_i\) 表示选择的颜色有 \(i\) 个球并且最终剩下该颜色对答案的贡献。
其中 \(p\) 是指第一个选到 \(i\) 个中一个,第二个选到另外的颜色的概率,显然 \(p=\frac{i(s-i)}{s(s-1)}\)。
\(g_i\) 是指当剩下 \(i\) 个球时最终能变成该颜色的概率,也就是这一步对答案的贡献。
移项得:
得:
推得:\(g_i=\frac{i}{s}\)。
已知 \(f_0=0\),如果能求 \(f_1\) 我们就赢了。
已知
为什么是这个值呢?因为:
最后代入 \(f_2=2f_1-1\) 得 \(f_1=\frac{(s-1)^2}{s}\)。
害,现在都要看着题解才会推,废掉惹。
[CF1713F] Lost Array
好巧妙的一道题(虽然可能是我见的题太少了)。
首先你可以 \(n^2\) 枚举起点终点然后用组合数算,\(i\to j\) 的贡献次数是 \(\binom{i-j+n}{n}\)。
发现只有贡献次数是奇数才会有贡献,因为是异或。我们知道当且仅当 \(j\) 在二进制下为 \(i\) 的子集时 \(\binom{i}{j} \equiv \pmod{2}\),但是现在的问题是 \(i-j\) 不固定,考虑能否使组合数的上项固定。
考虑在对角线上将问题拆开,因为一个点到对角线上的任意可到达的点的总步数都相等。
此时我们就只需要先用 FWT 求一个超集“和”,在求一个子集“和”的逆运算,因为这里是异或,所以逆运算相当于没逆。
[CF1392H] ZS Shuffles Cards
所以这种题到底是什么人在过啊???
- 第一步:
\(ans=E(\text{轮数})\times E(\text{每轮抽牌次数})\)!
虽然这一看就很对!但是并不妨碍我想不到。
- 第二步:
\(E(\text{一轮抽牌次数})=n\times E(\text{某张牌被抽到})+1=n\times E(\text{某张牌前面没有 joker})+1=\frac{n}{m+1}+1\)。
相当于在 \(m+1\) 个空里插一张牌,但只能插在最前面。
- 第三步:
\(E(\text{轮数})=\sum^n_{i=1} E(\text{还剩 i 张牌时抽到可用卡牌所用额外轮数})+1=\sum_{i=1}^n\frac{m}{i}+1\)。
为什么是 \(\frac{m}{i}\) 呢?因为卡牌出现在 joker 前的概率为 \(\frac{i}{m+i}\),所以期望轮数为 \(\frac{m+i}{i}\),但这里求的是额外轮数,所以减一得 \(\frac{m}{i}\)。
所以!\(ans=(\frac{n}{m+1}+1)(\sum^n_{i=1}\frac{m}{i}+1)\)。
还可以列方程做,不过上面的方法还是对期望的学习更有启发。