12 月 29 日 AtCoder Grand Contest 030
比赛链接:https://atcoder.jp/contests/agc030

C – Coloring Torus

思路:
如果当 $k$ 为 $4$ 的倍数时,有一种简单粗暴的方法就是奇数列填 $1 \sim k/2$ 偶数列填 $k/2+1 \sim k$,这显然是满足要求的,但因为这种方法每个数它左右两边都一样,可扩展性不强。我们可以在这个的基础上稍加变化,就是把第 $i$ 列向后移 $i$ 个,形式化的说就是:

对于奇数行 $col_{i,j} = (i+j)\mod k/2$
对于偶数行 $col_{i,j} = (i+j)\mod k/2 +k/2$

这样构造出来的矩阵就有很好性质,对于每个数不光它上下两个数是它的 $+1$ 和 $-1$,而且它左右两个数是它的 $k/2+1$ 和 $k/2-1$。因此很自然的可以想到如果 $k$ 不是 $4$ 的倍数时,设 $n$ 为 $\lceil \frac{k}{4} \rceil * 4$,然后将多出来的 $n-k$ 个数都减去 $n/2$。因为上面提到的性质,减去 $n/2$ 后可以看成将它上下两个数与左右两个数交换,这样依旧可以保证满足题目要求

代码链接

D – Inversion Sum

思路:
先把计数转化为求期望,我们设 $f_{i,j}$ 为 $A_i>A_j$ 的概率。可以发现每一次操作会改变 $O(n)$ 个 $f_{i,j}$ 的值,因此可以直接在对应的值上面修改即可。

代码链接

E – Less than 3

思路:
如果在 $01$ 之间画上蓝线,在 $10$ 之间画上蓝线,可以发现我们的每一次操作就是将一根线向左或向右移。且红线和蓝线之间的距离不超过 $3$,红线蓝线交替出现,串的左右两段有无数条线。而我们要做的就是把第一个串的线与第二个串对应起来,因此就枚举第二个串的第一根线对应于第一个串的那一根线,然后这种情况的答案就是确定的且可以 $O(n)$ 计算出来。

代码链接

F – Permutation and Minimum

思路:
有一个脑洞很大的 $DP$,从大到小考虑每一个数,设 $f_{i,j,k}$ 为考虑数 $i$ 时,有 $j$ 没有配对的确定的数,有 $k$ 个没有配对的 $-1$ 且。接下来考虑转移:

如果数 $i$ 确定且和它一对的另一个数也确定,那么它不会对答案产生影响,有 $f_{i,j,k}=f_{i+1,j,k}$
如果数 $i$ 确定且和它一对的另一个数是 $-1$,那么它可以不配对,有 $f_{i,j,k}=f_{i+1,j-1,k}$;这个它可以和一个 $-1$ 配对,有 $f_{i+1,j,k+1}$
如果数 $i$ 不确定,那么它可以不配对,有 $f_{i,j,k}=f_{i+1,j,k+1}$;它也可以和一个 $-1$ 配对,有 $f_{i,j,k}=f_{i+1,j,k+1}$;它还可以和一个确定的数配对,有 $f_{i,j,k}=(j+1)*f_{i+1,j+1,k}$

我们想这个 DP 的系数是怎么来的,如果两个 $-1$ 配对我们可以先把所有的 $-1$ 看成没有区别的,系数就为 $1$,最后乘上这样配对数的阶乘;如果一个 $-1$ 和一个确定的数配对,那么它可以有 $j+1$ 种选择,系数就是 $j+1$。

代码链接

发表评论

邮箱地址不会被公开。 必填项已用*标注