AtCoder 神题汇总

  • Post author:
  • Post category:其他


记录平时打 AtCoder 比赛时遇到的一些神题。

ABC128F

Frog Jump

Analysis

Tenka1 Programmer Contest 2019 D

Three Colors

题目大意

有 $n$ 个正整数 $a_1, a_2,\dots, a_n$($3\le n\le 300$,$1\le a_i \le 300$)。现在要把每个数涂成红,绿,蓝,三种颜色之一。将同色的数之和分别记作 $R,G,B$。试求使得 $R,G,B$ 是某三角形的三边长的涂色方案。结果模 $998244353$ 。

分析

这道题的正解是考虑



能构成三角形的涂色方案的数量。拿总方案数 $3^n$ 减去这个数量。

注意到 $R,G,B$ 三个数之和固定,将此和记作 $S$,即 $S = \sum_{i = 1}^{n} a_i$ 。

$R,G,B$



能构成三角形的充要条件是 $R,G,B$ 中某个数大于等于 $ S/2$ 。

又注意到,当 $S$ 是奇数时,$S/2$ 不是整数,上述充要条件变为 $R,G,B$ 中某个数大于 $S/2$ 。

我们先来考虑 $R, G, B$ 三者中某个数大于 $S/2$ 的方案数。

注意到 $R,G,B$ 三者中最多有一个数可能大于 $S/2$ 。由于染色方案的对称性,我们不妨先考虑 $R > S/2$ 的染色方案数。我们可以用类似于背包的 DP 求出使得 $R$ 等于某个确定值的染色方案数。令 $f[i][j]$ 表示对前 $i$ 个数染色,使得其中被染成红色的数之和为 $j$ 的染色方案数。那么 $3 \sum_{ R = \floor{S/2} + 1}^{S} f[n][R]$ 即为使得 $R, G, B$ 三者中某个数大于 $S/2$ 的染色方案数。

若 $S$ 是偶数,我们可以沿用上述方法求出使得 $R = S/2$ 的染色方案数,即 $f[n][S/2]$ 。但是若直接把 $3f[n][S/2]$ 加到总数里边,会导致重复计数。具体地说,这样做将使得 $R = S/2, G = S/2, B = 0$,$R = S/2, G = 0, B = S/2$ 和 $R = 0, G = S/2, B = S/2$ 这三种情况被计了两次。而这三种情况的数量即从给定的 $n$ 个数中选择一些数使得其和为 $S/2$ 的方案数,用类似于背包的 DP 可以求出这个数量。将此数量记作 $k$ 。

总之,若 $S$ 为奇数,答案是 $ 3^n – 3 \sum_{ R = \floor{S/2} + 1}^{S} f[n][R] $;若 $S$ 为偶数,答案是 $3^n – 3\sum_{ R = S/ 2}^{S} f[n][R] + 3k$ 。

ExaWizards 2019 C

Snuke the Wizard

Key observation: 最后剩下的小球最初所在的盒子必定是连续的一段。

将盒子从左到右编号为 $1$ 到 $n$ 。

如果最初在 $i$ 号盒子里的小球,从左侧消失,那么 $1$ 号到 $i$ 号盒子中的小球必定都从左边消失了。

如果最初在 $i$ 号盒子里的小球,从右侧消失,那么 $i$ 号到 $n$ 号盒子中小球必定都从右边消失了。

我们可以二分搜索最后剩下的小球最初所在的范围的左右边界。

转载于:https://www.cnblogs.com/Patt/p/10629863.html