25年11月AT计数题做题记录

AGC073C

因为实数不好处理所以我们考虑将实数映射到整数上去做,相当于我们把值域在 \([-(n-1),1]\) 之间的实数映射到 \([-(n-1)m,m]\) 之间的整数上,其中 \(m\rightarrow\infty\),现在我们需要考虑的就是值域在 \([-(n-1)m,m]\) 的整数的答案。

我们观察性质,可以发现对于 \(x_i\) 相同的连通块他们的 \(x_i\) 一定仅由这个连通块构成。考虑反证法,证明类似最大子段和,如果不同说明原来的定义矛盾了。所以我们现在考虑将原图划分成 \(k\) 个连通块,一个连通块的 \(x\) 和大小分别是 \(y_i\)\(c_i\)。考虑其对答案贡献的方案数为 \((y_i+1)^{c_i-1}\),原因是对于连通块中除深度最小的点外,其他点都能在 \([0,y_i]\) 内任意选择,最后用一个点一定能调回 \(y_i\),因为 \(c_i-1\) 个点的和的值域为 \([0,(c_i-1)m]\),而一个点的值域为 \([-(n-1)m,m]\),考虑到 \(c_i\le n\) 于是一定有解。然后我们乘上连通块的贡献 \(y_i^{c_i}\) 即可。因为题目中要求期望,于是我们转计数再除以方案数,所以一个连通块的贡献我们去枚举 \(y_i\),然后在树上进行划分,我们写出一个连通块最终的答案:

\[\sum_{y_i=0}^m(y_i+1)^{c_i-1}y_i^{c_i} \]

\(m\rightarrow\infty\) 时,答案为:

\[\int_0^1x^{c_i-1}x^{c_i}\text dx={1\over2c_i} \]

于是我们设 \(f_{i,j}\) 表示以 \(i\) 为根的子树还剩 \(j\) 个点需要划分连通块的答案。树上背包即可,时间复杂度 \(\mathcal O(n^2)\)

AGC070C

发现这道题的限制有点多,要求前缀 A 数量大于等于 B 数量,不能有连续的 A 或 B。我们先处理第一个限制,有一个妙手就是我们可以类似卡特兰数的方式去思考,直白一点就是反射容斥。我们看成从 \((0,0)\) 只能向上、向右或原地不动走到 \((a,b)\) 并且不能越过 \(y=x\) 这条直线,且不能连续向右/上的方案数,设为 \(f(a,b,c)\)

首先反射容斥就相当于要减去走到 \((b-1,a+1)\) 的方案。但是注意到可能存在原来合法的情况在翻折后变得不合法,注意到可能变得不合法的位置只有经过 \(y=x+1\) 的时候可能把向上向右变成向上向上,所以我们考虑翻折前不合法的情况对应翻折后的情况,也就是构造双射。因为过 \(y=x+1\) 的位置很特殊所以我们据此构造双射。

  • 对于原来两次向上我们可以用一次向上代替,方案数为 \(f(b-1,a,c)\)
  • 对于原来先向上再停留再向上我们可以用一次向上代替,方案数为 \(f(b-1,a,c-1)\)
  • 对于原来先向上在停留再向右我们可以用一次向上向右代替,方案数为 \(f(b-1,a+1,c-1)\)

现在考虑一个 \(f(a,b,c)\) 怎么求?我们可以枚举 \(C\)\(A\) 划分成了 \(i\) 段,这个方案数对 \(A\) 是插板法 \(a-1\choose i-1\),对 \(C\) 我们需要先把两边的空位各补一个 \(C\) 然后插板法 \(c+1\choose i\),最后放 \(B\) 首先对于连续的 \(a-i\)\(A\) 需要干掉,剩下的 \(b-a+i\)\(B\) 我们可以放在 \(A\) 的连续段或者 \(C\) 旁边,但是一个空只能放一个,于是就有 \(c+i+1\choose b-a+i\)。然后就做完了,时间复杂度 \(\mathcal O(n)\)

AGC069D

参考题解:this;神仙转化,我的一辈子。

注意到 \(a_i\) 的意义是跨过 \(i\) 的边数,我们考虑差分,设 \(l_i\) 表示从 \(i\) 连到左边的边数,\(r_i\) 类似。显然有 \(a_i=\sum_{j\le i}r_j-l_j\)

有了初步的转化后接下来就是经典的判定合法性,然后找充要去维护。首先去找必要条件:

  • 除了 \(l_1=r_n=0\),其余 \(l_i,r_i\) 均大于 0。
  • \(\sum_il_i=\sum_ir_i=n-1\)
  • \(\sum_{j\le i}l_j<i\),这个是显然的上界,考虑左半部分是森林。
  • 考虑 \(a_i\) 的意义是说让左部分和右部分连通需要的边数,考虑左边的连通块数为 \(i-\sum_{j\le i}l_j\),那么 \(a_i\) 至少需要这么多条边跨过 \(i\)

上述条件对于 \(r_i\) 也有类似对称的限制。

证明充分考虑构造证明,我们可以把 \(r_i,l_i\) 分别看成左右部点跑网络流。对于左部点我们从限制最严的开始去匹配右部点限制最松的,具体的,我们从后往前用 \(r_i\) 匹配 \(l_i\),并且优先使用更大的 \(l_i\)。然后我们就可以考虑 dp,设 \(f_{i,j,k}\) 表示考虑到 \(i\)\(a_i=j,\sum_{j\le i}l_j=k\) 的方案数,为了避免重复计算我们钦定 \(\sum l_j\) 是固定前两维后最小的。转移考虑枚举 \(\sum\),判断上面的充要条件是否满足,如果满足了就直接转移即可。时间复杂度 \(\mathcal O(n^4)\),发现你的转移实际上是矩形加,于是维护前缀和然后差分即可,但是注意有散点可能会出问题,单点修改一下即可做到 \(\mathcal O(n^3)\)

AGC068A

属于能力范围内的题,没做出来且红温。

考虑枚举答案 \(d\),然后求方案数。恰好为 \(d\) 的方案数不好求于是差分一下去求 \(\le d\) 的方案数。现在考虑钦定选 0,那么我们如果将每次选择方案的点顺时针旋转就会得到 \(L\) 种不同的选法,但是最后这只能贡献 \(n\) 次,于是最后答案需要乘上 \(L\over n\)

钦定选了 0 之后我们的合法区间就是 \([1,d]\cup[L-d,L-1]\)。注意到如果两个点全部在一个区间内就没有影响,但是如果一个在 \([1,d]\) 另一个在 \([L-d,L-1]\) 那它们可能会超过 \(d\) 然后爆炸。我们设 \(len=L-2d-2\),如果我们选择了 \([L-d,L-1]\) 里面的一个数 \(x\) 那么 \([x+d+1-L,x+d+1-L+len]\) 的数就不能选,我们设 \(x'=x+d+1-L\),考虑如果选择了 \(x\) 那么对应在 \([1,d]\) 中的 \([x',x'+len]\) 就不能选了。可以发现 \(x\)\([L-d,L-1]\) 中的相对位置等于 \(x'\)\([1,d]\) 中的相对位置,所以我们可以把前者映射到后者,考虑在 \([1,d]\) 上选点并染色。设选择染黑色代表选择的是 \([L-d,L-1]\) 的点,染白色代表选择了 \([1,d]\) 的点。那么如果我们选择 \(x\) 并染黑,那么 \([x,x+len]\) 的点就不能再选成白点了。于是我们枚举有 \(i\) 个黑点后面是白点,于是选择点的方法有 \(d-i\times len\choose n-1\) 种。现在再来考虑染色,注意到我们要将一些点划分成段,但是注意到首尾不完整于是我们手动补两个点,就相当于是把 \(n+1\) 个点分成 \(2i+2\) 段,方案数是 \(n\choose 2i+1\)

AGC046D

离做出来仅差一点。

考虑这种计数类的问题我们一定是先去考虑一个串是如何得到的,换句话说你也可以考虑判断其合法性。注意到每次的操作是前缀删除并且在序列中单点插入,于是我们一定是去考察初始串的后缀和新串的子序列最多匹配数。对于新串中不能匹配的位置就一定是单点插入的结果。于是我们考虑一个状态 \((i,j,k)\) 表示原串能匹配 \([i+1,n]\) 的后缀,可以插入 \(j\) 个 0 和 \(k\) 个 1 的方案数。为了防止重复计算,我们可以规定 1 后面只能加 0,0 后面只能加 1。我们可以先处理出可用的状态,转移考虑删掉两个可添加的数;也可以删掉可添加的数中的一个以及 \(a_i\);或者删掉 \(a_i,a_{i+1}\) 并且留一个。

最后再来 dp 求解方案数,还是上面的状态。转移倒着进行,因为是后缀的限制。转移过程中只用考虑当前位置是 0 还是 1,根据 \(a_i\) 考虑放什么东西即可。

AGC068E

一种比较常见的图论建模。

考虑对二元组 \(x_i,y_i\) 连一条 \(y_i\to x_i\) 的有向边且边权为 \(a_{x_i,y_i}\),这样我们的一个序列就变成了一张图,因为 \(y\)\(x\) 的置换。现在我们考虑对图计数,但是还有一个问题就是序列与图的对应关系并不是双射的,这往往就需要我们设定一个转移的顺序来构建双射。我们考虑如果知道了一张图那么我们能够确定 \(y\),方法是数每个点的度数,但是一个数会出现多次,所以我们无法知道一个数的具体信息,所以我们考虑去钦定一个遍历一个点出边的顺序,这样就能对应一个 \(x\) 序列。所以我们最后去对欧拉回路计数。

考虑计数欧拉回路需要注意什么东西。首先它会分成若干连通块,但是这些块间并无影响所以我们无需考虑。需要考虑的应该是一个连通块的形态如何统计,这里对于连通块的计数有一个经典的 trick,就是我们考虑钦定编号最小的点为起点,于是就可以简单转移了。我们设 \(f_{u,v,d}\) 表示这个连通块起点为 \(u\),走到了 \(v\)\(d\) 步。转移考虑枚举下一步走到哪里即可。

但是最后求答案的时候限制了 \(x_1\) 的取值,所以我们考虑倒着做这个问题,这样我们就只用在最后加 \(x_1\) 对应的点,对于最后一条边我们枚举一下即可,时间复杂度 \(\mathcal O(n^3m)\)

AGC057F

一道挺有意思的计数题,自己看洛谷题解不是很懂,max 讲了然后自己去看 AT 的题解就很易懂了。是好题,值得做!

首先我们可以换一种三元组的表达方式,考虑记录 \((x,a,b)\) 表示中间的点是 \(x\),其两边分别间隔 \(a,b\)。考虑变化的过程,若钦定 \(a<b\) 那么有 \((x,a,b)\to(x+a,a,b-a)\)\((x,a,b)\to(x-a,b-a,a)\)。我们考虑换一种更简洁清晰的表达方式,这里我使用了 AT 的图片:

这里我们省略了 \(x\) 仅保留 \((a,b)\),然后将两种转化看成两条边,边权就是 \(x\) 的变化量。于是我们统计不同的 \((x,a,b)\) 就变成了统计从根到图上每个点的路径数,可以发现两者恰好构成双射。进一步思考,一条边上有边权,那么对于一条从根开始的路径一定对应一个边权和。那么要统计到一个点的不同路径数,就相当于是统计边权和的情况数。计数的时候需要考虑不重不漏,所以我们需要找到一种合理的统计方式,在此之前我们可以先寻找图的性质。

我们设 \(a_i\) 表示第 \(i\) 次变化时中间的点的移动距离,也就是 \(a_i\) 代表第 \(i\) 列的边的边权的绝对值。考虑这个序列一种生成方式是在做辗转相减法的过程中记录较小的数,所以可以从这方面入手寻找性质。注意到在辗转相减的过程中我们会在某段时间减去相同的值,于是考虑把 \(a_i\) 划分成 \(\mathcal O(\log V)\) 个段。假设共有 \(m\) 段,对于第 \(i\) 段,我们假设有 \(c_i\)\(b_i\),现在我们在 \(b_i\) 上考虑。

这里有一个非常重要并且巧妙的性质:\(b_i=c_{i+1}\times b_{i+1}+b_{i+2}(i\le m-2)\),就比如上图中有 \(7=2\times3+1\)。等式成立的原因可以考虑用辗转相除法优化辗转相减法的时候,有 \((a,b)\to (b,a\bmod b)\),这其实就是一个被除数 \(=\) 除数 \(\times\)\(+\) 余数的等式。注意这个性质在最后其实并不成立,因为最后一段的 1 全选就能凑出上一段的数,于是我们考虑手动去掉一个 1 保持性质。有了这个重要的性质之后现在考虑计数,我们先翻译一下这个结论,把它变成能够直接用的:选择了一个 \(b_i\) 等价于选择了整段的 \(b_{i+1}\) 以及一个 \(b_{i+2}\)

那么我们考虑将所有的后者换成前者。当后者不能换成前者的时候说明第 \(i\) 段已经全选了,以此类推,前 \(i\) 段也已经全选了。说明我们一种边权和可以看成这样一种选择方案:选择了一个前缀 \(i\) 满足第一段一直到第 \(i\) 的所有数都已经全选,后面还有若干的 \(b_j\) 被选择,但是如果选择了整段的 \(b_j\) 就不能选择 \(b_{j+1}\)

刻画出了选择方式我们就可以对此 dp 了。设 \(f_{i,0/1}\) 表示考虑到了第 \(i\) 段,在前缀全选的段不足 \(i\) 的情况下这个段是否全选。转移是简单的,但这里还是负责任地讲一下。对于 \(f_{i,0}\),考虑这一段从哪个状态转移,并且这一段选多少个数。于是有 \(f_{i,0}=f_{i-1,1}+c_i\times(f_{i-1,0}+1)\)。考虑如果上一段全选那么这一段不能选数;如果上一段不是全选那这一段可以选 \([0,c_i-1]\) 个数;如果全选的前缀是 \(i\) 那么这一段能选 \([0,c_i-1]\) 个数。对于 \(f_{i,1}\)\(f_{i,1}=f_{i-1,0}\),这是显然的。

最后我们考虑统计答案。对于一段的贡献一起统计,设 \(s_i\) 表示第 \(i\) 段的答案。考虑一个段 \(i\) 最后一个位置 \(j\) 的答案为 \(f_{j,0}+f_{j,1}+1\),但是一个段中不同的位置其 \(f_{j,0}\) 是不同的,因为 \(f_{j,0}\) 与这个段的前缀长度有关。什么意思呢?就是说假设位置 \(j\) 是第 \(i\) 段的第 \(k\) 个位置,我们转移 \(f_{j,0}\) 的时候这个段能够选择的数其实只有 \([0,k-1]\),所以一个段中的 \(f_{j,0}\) 略有不同,于是统计一个段的答案的时候就不能直接写 \(c_i\times(f_{i,0}+f_{i,1}+1)\),而是去枚举段中的每个数,有:

\[s_i=\sum_{j=1}^{c_{i}}(f_{i-1,1}+j\times(f_{i-1,0}+1))+f_{i-1,0}+1 \]

\(j\) 提出来化简即可。考虑最后的答案之和,根据上图,注意到除了最后一个段其他都有两个点,然后你还要考虑不做任何操作以及开头还有两个选择,并且前面去掉的那个 1 最后还会有贡献需要加回去,于是答案为 \(3+\left(\sum_{i=1}^{m}2s_i\right)-2s_{m-2}-s_{m-1}\)。最后时间复杂度为 \(\mathcal O(q\log (c-a)\))。

AGC067B

这种题首先考虑判断合法。有一个比较明显的想法是我们每次找操作区间,看区间内的数是否全部相同,或者为空,如果是就可以把区间删空。最后如果能删掉所有数那么这个序列就是合法的。对于这种区间删数的操作我们考虑用区间 dp 解决。

\(f_{l,r}\) 表示只考虑完全被 \([l,r]\) 包含的区间时 \(a\) 的合法方案数。注意如果这些区间的并集不为 \([l,r]\) 那么一定不能删空所以有 \(f_{l,r}=0\)。考虑转移,其实你会发现这个不太好做,于是果断容斥。我们考虑怎么才不合法,如果一个区间中不全为空并且存在两个数不同那么这个区间就不能被操作。于是我们设 \(g_{l,r,p}\) 表示考虑 \([l,r]\),已经钦定 \(r\) 的取值后上一个不同的数在 \(p\) 的方案数。转移考虑往后面加的数是否相同。

如果加入相同的数,我们枚举这个位置就有 \(g_{l,r, p}\times f_{r+1,k-1} \to g_{l,k,p}\)。否则就有 \(g_{l,r,p}\times f_{r+1,k-1}\times(C-1)\to g_{l,k,r}\)。然后就是转移的时候需要判断能否转移,也就是是否存在一个区间 \([lp,rp]\) 满足 \(p<lp\le r\le rp<k\)。对于合法的转移范围我们提前处理即可。总的时间复杂度为 \(\mathcal O(n^4)\)

posted @ 2025-11-12 22:18  Lyrella  阅读(24)  评论(0)    收藏  举报