arc112-solution-post
ARC112 Solution
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}\)。因此答案就是
\(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\) 中,能换成的卡牌最小数量。
由裴蜀定理,\(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)\) 的手牌最后换成的牌数,可以得到转移
于是建图,\(\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,数学,思维)

浙公网安备 33010602011771号