数字游戏
存在至少一种方案,当且仅当 m i n ≤ a v e ≤ m a x min \le ave \le max min≤ave≤max 并且 m i n ∗ ( n − 1 ) + m a x ≤ a v e ∗ n ≤ m i n + m a x ∗ ( n − 1 ) min * (n-1)+max \le ave * n \le min + max * (n - 1) min∗(n−1)+max≤ave∗n≤min+max∗(n−1)。
https://paste.ubuntu.com/p/NMXwPBWqBF/
网格路径
因为第一步只能从 ( 1 , 1 ) (1,1) (1,1) 走到 ( 1 , 2 ) (1, 2) (1,2) 或 ( 2 , 1 ) (2, 1) (2,1),所以不相交路径最多只有两条。我们可以用如下方法构造两条路径:
- 对于第一条路径,每次能向右走(走完以后可以顺利走到终点)就先向右走,不能向右走就向下走;
- 对于第二条路径,每次能向下走(走完以后可以顺利走到终点)就先向下走,不能向下走就向右走;
接下来判断一下这两条路径是否存在以及是否相交就可以啦!
https://paste.ubuntu.com/p/b76XRkk593/
虫族基地
分如下几种情况考虑:
- ( 1 , 1 ) (1, 1) (1,1) 被第一个虫族基地占领了;
- ( n , m ) (n, m) (n,m) 被第二个虫族基地占领了;
- 1 个虫族基地扩张,占领了完整的一列;
- 2 个虫族基地扩张,并且领地切断了所有
(
1
,
1
)
(1, 1)
(1,1) 到
(
n
,
m
)
(n, m)
(n,m) 的路径;
在这些代价中取最小值即可。
https://paste.ubuntu.com/p/HQrq6x6595/
环上游走
暴力 dfs就可以过啦(如果当前走到的格子之前没走到过,就继续走,否则就回溯)!
https://paste.ubuntu.com/p/KTPdKn6rCH/
怀旧游戏
用
f
[
i
]
[
j
]
[
k
]
[
l
]
f[i][j][k][l]
f[i][j][k][l] 表示先手手上的数字是
i
,
j
i, j
i,j,后手手上的数字是
k
,
l
k, l
k,l 时,先手的胜负情况。初始先手必败的情况比较好处理(
k
k
k 或
l
l
l 是 0,意味着先手已经输了),接着反向 bfs,对于一个状态,如果它存在一个先手必败的后续状态,则这个状态先手必胜;如果它所有的后续状态都是先手必胜的,则这个状态先手必败。
对于无法确定胜负的状态,都是平局。
https://paste.ubuntu.com/p/M9KJzDCBZy/
消消乐
先处理完所有的终止状态(填满 8 个格子的不可以消除的状态),这些状态最后的期望得分都是 0。对于每个消完以后的状态 x x x(从初始的 8 个格子开始消,在新方块出现前的状态),我们可以枚举新方块的颜色情况,同时也知道了每种情况下消完以后的状态 y y y 是啥样,以及得到了多少分,同时我们也知道从 x x x 变成 y y y 的概率,我们把期望方程列出来,高斯消元即可。
https://paste.ubuntu.com/p/XtKPn9mwVC/
二叉树
用 f [ i ] [ j ] f[i][j] f[i][j] 表示以 i i i 为根的子树,这棵子树进出的点的数目为 j j j 时( j j j 可正可负,表示点是净移入还是净移出)在子树 i i i 中花费的最小代价。对于每个 i i i,由于它只能有 2 个儿子,所以我们需要再做一次背包来计算 f f f。
https://paste.ubuntu.com/p/6z8VTF78rF/
数据结构
将区间视为平面上的点,如果一种颜色在区间内出现至少一次,需要考虑取答案对应的区间为:
- 区间内相邻两次出现之间。
- 区间左端点到区间内第一次出现。
- 区间内最后一次出现到区间右端点。
可以用扫描线加线段树解决。
https://paste.ubuntu.com/p/M2bmSqysgW/