arc112-solution-post

ARC112 Solution

link


D - Skate

建模,每行每列分别建一个点来表示,有 # 的地方就把它的行和列连起来。

那么最后要么所有列都联通,要么所有行都联通。

直接输出行的联通块数量,列的连通块数量的最小值减 \(1\) 就好了。

注意一开始矩阵四个角落也是两两要连边的。

(*2400~2600,构造,图)


E - Cigar Box

对于一个数,只有最后一次操作对它有意义。

那么对于每个数只保留最后一次操作,这个操作序列称为简化操作序列,它的长度为 \(k\)

先考虑对于一个长度为 \(k\) 的简化操作序列,如何计数其他操作的方案数。

这些操作可以随意插到最后一次操作前面。那么方案数就是 \(m \brace k\)

还要考虑这些操作放前放后都可以,就是 \({m\brace k}2^{m-k}\)

现在对简化操作序列计数。考虑把序列 \(1\sim n\) 抽一些数出去,中间剩下的就是一段递增区间。

我们在 \(a\) 中枚举这个递增区间 \([l,r]\),那么 \(a_{1...l-1}\) 的最后一次操作就是往左的,\(a_{r+1...n}\) 的最后一次操作往右。

虽然它们操作方向确定,往左的操作之间顺序也确定(往右同理),但是往左右操作之间的顺序可以随意排列。

那么易得这部分方案数是 \(\dbinom{l-1+n-r}{l-1}\)。因此答案就是

\[\sum_{k=0}^nf(k){m\brace k}2^{m-k} \]

\(f(k)\) 表示长度为 \(k\) 的合法简化操作序列数量。

(*2900~3100,数学)


F - Die Siedler

我们只在乎一手牌最后换成多少张牌。那么一手牌可以抽象为全部都是 \(1\) 的牌,只要它们最后换成的牌数一样就行。

记手牌能换成的 \(1\) 牌数量为它的价值。那么易知一手牌 \(\{a_n\}\) 价值为 \(\sum_{i=1}^na_i2^{i-1}(i-1)!\)

现在把所有卡包也换成 \(1\),假设卡包 \(\{s_i\}\) 价值为 \(b_i\)

注意到将 \(2n\)\(n\) 牌换成 \(1\) 牌,这手牌的价值就会减少 \(2^nn!-1\) 张。设初始手牌价值为 \(R\)

于是最后得到的卡包价值就是

\[v=R+\sum_{i=1}^nb_ix_i-y(2^nn!-1) \]

所求即为所有 \(v\) 中,能换成的卡牌最小数量。

由裴蜀定理,\(v-R\) 要是 \(\gcd(b_1,b_2,b_3,\cdots,b_n,2^nn!-1)\) 的倍数。

\(d=\gcd(b_1,b_2,b_3,\cdots,b_n,2^nn!-1)\),则 \(v\equiv R\pmod d\)

接下来考虑根号分治:

  • \(d>\sqrt{2^nn!}\)

因为 \(v\) 不会超过 \(2^nn!\),我们暴力枚举 \(v\),暴力贪心出最后换成的卡牌数,复杂度 \(\mathcal O(\frac{2^nn!}dn)=\mathcal O(n\sqrt{2^nn!})\)

  • \(d\le\sqrt{2^nn!}\)

\(f(x)\) 表示价值为 \(x(x<d)\) 的手牌最后换成的牌数,可以得到转移

\[f((x+2^{k-1}(k-1)!)\bmod d)\gets\min((f(x+2^{k-1}(k-1)!)\bmod d),f(x)+1) \]

于是建图,\(\forall k\in[1,n]\)\(x\)\((x+2^{k-1}(k-1)!)\bmod d\) 连边权 \(1\) 边,求到 \(R\bmod d\) 的最短路即为答案。

用 dijkstra 的话复杂度应该是 \(\mathcal O(dn\log d)=\mathcal O(n\sqrt{2^nn!}(n+\log n!))\)。SPFA 应该更快。

(*3200~3500,数学,思维)

posted @ 2024-02-27 20:20  iorit  阅读(17)  评论(0)    收藏  举报