中位数
n 够小,可以考虑 $n^2$ 解法,因而易想到,对于每个数,比他大的记为 1,反之记为 -1,接着遍历每个位置的前缀和,如果有相同的值,就加上出现的次数即可。
|
|
子序列
注意到题目要求,两侧大于中间,同时原数组是个排列。
求最长的子序列,确定两侧的值,将中间大于两侧的值都删掉即可。
从大到小遍历值,依次确定 l, r,有新来的就更新区间,看能否扩大区域,此时答案即为区域长度减去中间比两侧大的值的数。
|
|
传送门
优先走同色路径,一直走到不能走,再走需要花费代价的路径。
|
|
景区建设
注意到建设传送器的代价极大,远大于联通传送器的代价,所以首要目的是少建传送器,接着看传送器联通代价可以发现,高度产生的贡献远大于位置差的贡献,所以传送器之间从高到低依次连接。
从高到低构建联通块,联通块的个数,即为传送器的个数,再将每个联通块的最高点排序后依次连接即可
|
|
树上LCM
- LCM(x, y) 的过程实际上是对 x, y 的每个质因子个数取 max 的过程。
- 如果 LCM(x, y) != x,那么如果仅对 y 进行 LCM 操作是无法变成 x 的。
只有 x 的约数,才能做出贡献,我们只需要在所有的路径中不断连接约数,看有多少种连法即可,通过树上 DP 维护。
先找到 x 的所有约数,然后离散化到一个数组中。
进行 DP,当前位置是 x 的约数,才能进行 DP,否则只能继承子状态,结束自身。
若是 x 的约数,即可对其子节点的所有约数出现次数操作,加合。
|
|
奸商
奇数长度一定可以,因为中心位置始终是一字符,自己和自己相同。
偶数长度为 n 的如果可以,那么长度为 m (n < m) 的一定可以。
只需要对长度为 len 的串依次判断,左右若不等,赋一份 ascii 码小的记到当前统计结果(通过二进制来记录 17 位字母),若有相等,这一段不需要幻视都可通过。
对所有长度为 len 的串统计过结果后,得到所有可行方案的二进制串,可通过 SOSdp 将所有不可能的方案排除,在剩下的方案中取最小的
|
|
博弈
nim 获胜:所有堆异或不为 0
anti-nim (最后一次操作的人输) 获胜:
-
- 当每堆石子的数量都为 1 时,异或和为 0 时先手获胜;
-
- 当有至少一堆石子的个数大于 1 时,异或和不为 0 时先手获胜。
房间可以分为 4 种:
-
C1 (王牌房, Win): 至少有一堆石子 > 1,且 Grundy 值 G ≠ 0。
- 效果: 先手玩家进入此房间,可完全控制后续,立即获胜。
- 数量计为
n1。
-
C2 (直通房, Pass-through): 所有石子堆都是 1,且堆数为偶数。
- 效果: 先手玩家进入,会输掉这个子游戏,总步数为偶数。轮次不变,自己继续开启下一房间。
- 数量计为
n2。
-
C3 (转换房, Conversion): 所有石子堆都是 1,且堆数为奇数。
- 效果: 先手玩家进入,会赢下这个子游戏,总步数为奇数。轮次翻转,对手开启下一房间。
- 数量计为
n3。
-
C4 (必败房, Lose): 至少有一堆石子 > 1,且 Grundy 值 G = 0。
- 效果: 先手玩家进入,会将控制权交给对手,立即落败。
- 数量计为
n4。
Alice 的目标是排列房间,使得轮到她时,她能进入一个 C1 房;或者轮到 Bob 时,Bob 进入一个 C4 房。
设 P(w, l, t) 为当前玩家面对 w 个王牌房(C1),l 个必败房(C4),t 个转换房(C3)时,获胜的概率。 当前玩家从这 w+l+t 个房间中随机选择一个作为序列的下一个。
选中 C1 (概率 $\frac{w}{w+l+t}$): 立即获胜。贡献为 $\frac{w}{w+l+t} \times 1$。 选中 C4 (概率 $\frac{l}{w+l+t}$): 立即失败。贡献为 $\frac{l}{w+l+t} \times 0$。 选中 C3 (概率 $\frac{t}{w+l+t}$): 轮次翻转。对手面对 w, l, t-1 的局面。自己获胜的条件是对手失败。对手获胜概率为 P(w, l, t-1),所以自己获胜概率为 1 - P(w, l, t-1)。贡献为 $\frac{t}{w+l+t} \times (1 - P(w, l, t-1))$。
将三者相加,得到递推式: $P(w, l, t) = \frac{w + t \cdot (1 - P(w, l, t-1))}{w+l+t}$
|
|
夜世界
| 变量 | 类型 | 含义 |
|---|---|---|
l, r |
int |
存储在 tr 数组中的索引,分别指向左、右子节点。 |
sum |
ll |
区间 [l, r] 内所有 a_i 的和。用于计算区间内的总支付额。 |
tmp |
ll |
区间 [l, r] 内所有 b_i 的和。主要用于辅助计算和理解 B。 |
B |
ll |
理想金币净变化。代表在不考虑金币不能为负的限制下,穿过该区间后金币的总增量。B = sum(a_i - b_i)。 |
A |
ll |
最低金币保证/保底值。代表无论进入该区间时金币多寡,离开时金币数目的下界。它量化了 max(0, ...) 操作的累积效应。 |
为了使用线段树等数据结构,我们必须将“带着 m_in 的钱穿过一个区间 [L, R]”这个过程,抽象成一个可以快速计算和合并的函数 f(m_in),使得 m_out = f(m_in)。
-
单个普通金矿
i的函数:- 过程:
m -> m + a_i,然后m -> m - min(m, b_i)。 - 合并后:
m_out = (m_in + a_i) - min(m_in + a_i, b_i)。 - 利用恒等式
x - min(x, y) = max(0, x - y),我们得到:m_out = max(0, m_in + a_i - b_i)。
- 过程:
-
推广到区间的函数模型: 我们发现,单个金矿的函数形式可以被一个更通用的模型所描述:
m_out = max(A, m_in + B)对于单个金矿i,A=0,B = a_i - b_i。 -
函数的合并 (核心): 假设我们已知左右两个子区间
[L, mid]和[mid+1, R]的函数参数(A_L, B_L)和(A_R, B_R)。我们来推导合并后的大区间[L, R]的新参数(A_new, B_new)。- 经过左区间:
m_mid = max(A_L, m_in + B_L) - 带着
m_mid经过右区间:m_out = max(A_R, m_mid + B_R) - 代入
m_mid:m_out = max(A_R, max(A_L, m_in + B_L) + B_R) - 展开化简:
m_out = max(A_R, A_L + B_R, m_in + B_L + B_R) - 整理成目标形式:
m_out = max( max(A_R, A_L + B_R), m_in + (B_L + B_R) )
通过对比,我们得到了函数的合并法则:
B_new = B_L + B_RA_new = max(A_R, A_L + B_R)
这个合并操作是
O(1)的,满足结合律,因此我们可以使用线段树来维护。 - 经过左区间:
|
|