二轮省集day4
\(80+0+25\),感觉今天打的很戏剧性,暴露出了很多问题。
首先在 t1 上没有想到大家普遍的容斥做法,而是选择能做更强问题的二项式反演,后面进一步的 dp 很长一段时间只会 \(O(m^3)\),经过对提交记录的随机抽样,发现很多人都通过了 t1 \(80\) 分。由于对 t2 没有任何头绪,接下来选择去看 t3,利用一些观察到的结论刻画成了将一张不含 \(K_{\ge 4}\) 的图分成三个完全子图的方案数,很快会了一个建反图的多项式复杂度做法,可惜是假的,索性根据这个结论写了个搜,感性理解复杂度不会很高,可惜只能过前两档,在开场三个半小时才获得本场比赛的第一分。
此时好像身边所有人都过了 t1 \(80\) 分。于是我不断 push 自己去做 t1,最后根据一些点边容斥获得了一个 \(O(m^2)\) 的 dp,写完以后获得了该场的分数。t2 暴力没写完。
还是在把省集当作能看见榜的 IOI 赛制在打,不应该通过随机抽样提交记录 判断自己当前的分数处于什么水平。这错完了,对策略没有任何训练。一些东西还是想不到 simple 的做法。
挂一下 t1 做法。将 \(i\) 和 \(m-i\) 和 \(m+1-i\) 连边,不难发现这是一个有 \(m\) 个点的链,于是问题就变成了整个序列不包含链上任意一条边的方案数。记 \(f_i\) 代表整个序列上包含恰好 \(i\) 条边的方案数,\(g_i\) 代表钦定 \(i\) 条边需要被选中的方案数。实际上这和容斥是一样的,只不过二项式反演能做的问题更强罢了。
于是求出 \(g_i\) 就可以二项式反演求出答案了。\(g_i\) 显然和连通块数相关,设 \(1\sim m\) 被分成了 \(k\) 个大小大于 \(1\) 的连通块,则 \(g_i=s_{i,k}\times 2^k(n-i-1+k)!\)。直接在链上 dp 可以做 \(O(m^3)\)。然后我花费了非常长的时间才观察到阶乘的式子错了,应该为 \(g_i=s_{i,k}\times 2^k(n-i)!\),实际上是最基本的点边容斥。定义一个方案的权值为 \(2^k\),观察到 \(k\) 就是为该条边选且前一条边不选的边的数量,直接 dp 即可做到 \(O(m^2)\)。
唉这个思路理应很自然的,但是式子错了导致很长时间都不会做。