11 月 23 日
* A. 座号重分配
注意到
a i b j + a j b k + a k b i ≥ a k b j + a j b i + a i b k ⟺ ( a k − a j ) ( b i − b j ) − ( a i − a j ) ( b k − b j ) ≥ 0 a_i b_j+a_j b_k+a_k b_i \ge a_k b_j+a_j b_i+a_i b_k \iff (a_k - a_j)(b_i - b_j) - (a_i - a_j)(b_k - b_j) \ge 0
a i b j + a j b k + a k b i ≥ a k b j + a j b i + a i b k ⟺ ( a k − a j ) ( b i − b j ) − ( a i − a j ) ( b k − b j ) ≥ 0
故若令 A i = ( a i , b i ) A_i = (a_i, b_i) A i = ( a i , b i ) ,那么有 A i A i + 1 → × A i + 1 A i + 2 → ≥ 0 \overrightarrow{A_iA_{i + 1}} \times \overrightarrow{A_{i + 1}A_{i + 2}} \ge 0 A i A i + 1 × A i + 1 A i + 2 ≥ 0 ,每次跑一次凸包,删去凸包上的点后解决子问题,然后枚举凸包上的点看如何拼接.
* B. 实习生分配
唐.
不妨枚举 a , b a, b a , b 的最大值 p , q p, q p , q ,那么为了最小化部门 Y 的价值,a i ≤ p a_i \le p a i ≤ p 且 b i ≤ q b_i \le q b i ≤ q 的点全都发配到部门 X 一定不劣.按照 p p p 降序扫描线,过程中对每个 q q q 维护 max c i + max d i + q \max c_i + \max d_i + q max c i + max d i + q ,修改形如全局取 max \max max ,由于初始状态是通过前缀取 max \max max 得到的,故事实上是区间覆盖.容易使用线段树维护,注意需要精细地保证 X 和 Y 部门都有人.
! C. 城镇分配
还没补.
11 月 26 日
* A. 白云一片去悠悠
我们选取一个联通块中最小的且最靠左上方的元素作为这个连通块的特征元素,对联通块计数即对特征元素计数.
考虑一个元素 ( i , j ) (i, j) ( i , j ) 何时能够成为特征元素.如果它往四个方向直走,只经过合法的格子,能够走到一个权值比自己小的格子,那么它肯定不是特征元素.现在我们尝试证明,从某个格子开始,若其上下左右四个方向上第一个权值比自己小的格子都无法通过直走到达,那么它就是一个特征元素.采用反证法,不妨设它能走到它上方的那个比自己小的格子,那么它需要绕过挡住自己的那个格子,不妨设路径是 ( i , j ) → ( i , k ) → ( p , k ) → ( p , j ) (i, j) \to (i, k) \to (p, k) \to (p, j) ( i , j ) → ( i , k ) → ( p , k ) → ( p , j ) ,那么有 b k < b j b_k < b_j b k < b j ,那么有 a i + b k < a i + b j a_i + b_k < a_i + b_j a i + b k < a i + b j ,即 w i , k < w i , j w_{i, k} < w_{i, j} w i , k < w i , j ,与四个方向上都走不到矛盾.
故设 p a i \mathrm{pa}_i p a i 为最大的 j j j 满足 a j < a i a_j < a_i a j < a i ,s a i \mathrm{sa}_i s a i 为最小的 j j j 满足 a j < a i a_j < a_i a j < a i ,p b i , s b i \mathrm{pb}_i, \mathrm{sb}_i p b i , s b i 类似.那么就是求有多少点对 ( i , j ) (i, j) ( i , j ) 满足
a i + b j ≤ x a i + min { max k = p b j j b k , max k = j s b j b k } > x b j + min { max k = p a i i a k , max k = i s a i a k } > x \begin{aligned}
a_i + b_j \le x \\
a_i + \min\{\max_{k = \mathrm{pb}_j}^{j} b_k, \max_{k = j}^{\mathrm{sb}_j} b_k\} > x \\
b_j + \min\{\max_{k = \mathrm{pa}_i}^{i} a_k, \max_{k = i}^{\mathrm{sa}_i} a_k\} > x
\end{aligned}
a i + b j ≤ x a i + min { k = p b j max j b k , k = j max s b j b k } > x b j + min { k = p a i max i a k , k = i max s a i a k } > x
扫描线即可.
* B. 模板性二维数点
假设我们设定了阈值 x x x ,只考虑 a i y < x , b j y > x a_i^y < x, b_j^y > x a i y < x , b j y > x 的情况,发现选取出的点对一定至少包含一个两边的最大值.考虑对 y y y 轴分治,求出可能成为答案的点对,容易发现个数是 O ( n log n ) O(n \log n) O ( n log n ) .
然后扫描线即可.
* C. 多刀流
分类讨论.
m = n m = n m = n 时,只需判断整个串是否单调升,若不是则可行.
m = 2 m = 2 m = 2 时,枚举分界点.
m = 3 m = 3 m = 3 时,考虑是 T 1 > T 2 T_1 > T_2 T 1 > T 2 还是 T 2 > T 3 T_2 > T_3 T 2 > T 3 .
T 1 > T 2 T_1 > T_2 T 1 > T 2 时,可以被调整到 ∣ T 2 ∣ = 1 |T_2| = 1 ∣ T 2 ∣ = 1 ,直接枚举即可.
T 2 > T 3 T_2 > T_3 T 2 > T 3 时,考虑最终的划分方案:
T 2 T_2 T 2 中存在字符大于 T 3 T3 T 3 中的字符,可以调整使得 ∣ T 2 ∣ = 1 |T_2| = 1 ∣ T 2 ∣ = 1 .
剩下的情况,T 2 T_2 T 2 中只包含一种字符,且最大化 ∣ T 2 ∣ |T_2| ∣ T 2 ∣ 是最优的.
于是直接枚举连续段作为 T 2 T_2 T 2 即可.
m ≥ 4 m \ge 4 m ≥ 4 时,只需找到一个位置 i i i 使得 s i > s i + 1 s_i > s_{i + 1} s i > s i + 1 或 s i = s i + 1 = s i + 2 s_i = s_{i + 1} = s_{i + 2} s i = s i + 1 = s i + 2 即可.
11 月 30 日
* A. 种豆南山
一种作物分布唯一对应一个最小的能够将所有有作物的格子框住的矩形,我们称这个矩形为这个分布的特征矩形.
考虑枚举矩形,计算特征矩形为当前矩形的分布个数.需要很麻烦的分讨.咕咕咕咕.
! B. 长城烽火
还没补.
! C. 光明教会
还没补.
12 月 10 日
没打.
12 月 14 日
* A. 帮派斗争
* B. 轨道对齐
回想到对于一个序列 a i a_i a i ,存在 k k k 次多项式 P ( x ) P(x) P ( x ) 满足 P ( i ) = a i P(i) = a_i P ( i ) = a i 的充要条件是 a a a 的 k + 1 k + 1 k + 1 阶差分全为 0 0 0 .
故只用找到 b b b 的一个循环位移,使得其的 k + 1 k + 1 k + 1 阶差分和 a a a 的 k + 1 k + 1 k + 1 阶差分相同.可以轻松使用哈希解决,问题是如何快速计算高阶差分.
考查 k + 1 k + 1 k + 1 阶差分的表达形式:
Δ n a i = ∑ j ( k + 1 j ) ( − 1 ) k + 1 − j a i + j \Delta^n a_i = \sum_j \binom{k + 1}{j} (-1)^{k + 1 - j} a_{i + j}
Δ n a i = j ∑ ( j k + 1 ) ( − 1 ) k + 1 − j a i + j
是一个卷积的形式,直接 FFT 加速卷积即可.
* C. 增长序列
没写完代码. \Huge\color{red}\text{没写完代码.} 没写完代码.
记 [ l , r ] [l, r] [ l , r ] 中前 m m m 大的数构成的集合为 S l , r S_{l, r} S l , r ,尝试对于当前的右端点 r r r 维护出 r e s r , l \mathrm{res}_{r, l} r e s r , l 表示 S l , r S_{l, r} S l , r 中元素的积,考虑从 r e s r − 1 \mathrm{res}_{r - 1} r e s r − 1 如何推到 r e s r \mathrm{res}_{r} r e s r .
考虑维护一个类单调栈的结构,具体地,对于一个 r r r ,若 S l , r ≠ S l + 1 , r S_{l, r} \not= S_{l + 1, r} S l , r = S l + 1 , r ,那么我们称 l l l 为一个关键点.若一个数右边有 ≥ m \ge m ≥ m 个不小于它的数,那么它显然不会再作为关键点了,这启发我们用一个链表维护关键点,每个节点上放一个计数器,若插入的数 ≥ \ge ≥ 自己就令计数器自增,达到 m m m 后就将自己从链表中删去,这一部分复杂度显然均摊 O ( n m ) O(nm) O ( n m ) .
但是每次插入都会遍历一次这个链表,这一部分复杂度是 O ( n 2 ) O(n^2) O ( n 2 ) 的,不太牛!又发现若遍历链表的过程中已到过 m m m 个 ≥ \ge ≥ 插入数字的数,那么剩下的部分显然不会有变动,可以直接润.故这一部分的复杂度降至 O ( n m ) O(nm) O ( n m ) .
有了关键点的链表,维护 r e s r \mathrm{res}_r r e s r 是容易的:只需要暴力重算修改过的位置即可.这一部分需要精细实现,你猜猜我为啥没写完代码 .
显然上述的维护过程会造成一车区间加,而答案可写作下式:
∑ r − l + 1 = x r e s r , l \sum_{r - l + 1 = x} \mathrm{res}_{r, l}
r − l + 1 = x ∑ r e s r , l
是一个斜 45 度的历史和的形式,如下图
图中橙色竖线代表一次区间加,红色矩形代表这次区间加的影响范围,青色点代表一个询问点,青色斜线代表这次询问需要统计的贡献范围.
首先先将 3-side 矩形加差分成 2-side 矩形加,然后我们可以将每个 2-side 矩形加记作三元组 ( s i , t i , d i ) (s_i, t_i, d_i) ( s i , t i , d i ) ,其中 ( s i , t i ) (s_i, t_i) ( s i , t i ) 表示矩形加的左下端点,询问 ( p , q ) (p, q) ( p , q ) 的答案可被写作:
∑ t i ≤ q ( q − t i + 1 ) d i + ∑ p − s i ≤ q − t i ( ( p − s i + 1 ) − ( q − t i + 1 ) ) d i = ( q + 1 ) ∑ t i ≤ q d i − ∑ t i ≤ q t i d i + ( p − q ) ∑ p − q ≤ s i − t i d i − ( s i − t i ) ∑ p − q ≤ s i − t i t i d i \begin{aligned}
& \sum_{t_i \le q} (q - t_i + 1) d_i + \sum_{p - s_i \le q - t_i} ((p - s_i + 1) - (q - t_i + 1)) d_i \\
=\ & (q + 1) \sum_{t_i \le q} d_i - \sum_{t_i \le q} t_i d_i + (p - q) \sum_{p - q \le s_i - t_i} d_i - (s_i - t_i) \sum_{p - q \le s_i - t_i} t_i d_i
\end{aligned}
= t i ≤ q ∑ ( q − t i + 1 ) d i + p − s i ≤ q − t i ∑ ( ( p − s i + 1 ) − ( q − t i + 1 ) ) d i ( q + 1 ) t i ≤ q ∑ d i − t i ≤ q ∑ t i d i + ( p − q ) p − q ≤ s i − t i ∑ d i − ( s i − t i ) p − q ≤ s i − t i ∑ t i d i
故只需支持单点加查询前缀和.又我们有 O ( n m ) O(nm) O ( n m ) 次修改,O ( n ) O(n) O ( n ) 次查询,故使用 O ( 1 ) O(1) O ( 1 ) 单点加 O ( n ) O(\sqrt{n}) O ( n ) 查询前缀和的分块维护,总复杂度 O ( n m ) O(nm) O ( n m ) .
12 月 17 日
A. game
若我们预处理出了 f i , j f_{i, j} f i , j 表示 ( 1 , 1 ) (1, 1) ( 1 , 1 ) 向右下走到 ( i , j ) (i, j) ( i , j ) 的最大权值和 g i , j g_{i, j} g i , j 表示 ( R , C ) (R, C) ( R , C ) 向左上走到 ( i , j ) (i, j) ( i , j ) 的最大权值.
若 Bob 的路径已经确定,那么可以通过尝试拼接路径两侧的 f f f 和 g g g 数组来计算当前局面上 Alice 的最大权值和.把这个过程丢到一个 DP 里就可以解决本题.
具体地,设 h i , j , 0 / 1 h_{i, j, 0 / 1} h i , j , 0 / 1 表示 Bob 从 ( 1 , C ) (1, C) ( 1 , C ) 向左下走到 ( i , j ) (i, j) ( i , j ) ,上一步是横 / 竖着走的(为了提前计算拐角处贡献),Alice 的最小的最大收益.转移尝试拼上一段竖 / 横着的路径和路径末端的拐角即可.
* B. 永无宁日 II
shaber 点分治题.
考虑计算跨越一个点 r r r 的所有路径的贡献.对于当前的 r r r ,计算连通块内所有点到 r r r 后的危险度是多少,若不能到达就设为 ∞ \infty ∞ ,记为 u p u \mathrm{up}_u u p u .为了计算 u p u \mathrm{up}_u u p u ,我们记录 r e m u \mathrm{rem}_u r e m u 表示危险度为 ≤ r e m u \le \mathrm{rem}_u ≤ r e m u 的人进入 u u u 后能够到达 r r r ,有转移:
r e m v ← min { r e m u − d v , k v } \mathrm{rem}_v \leftarrow \min\{\mathrm{rem}_u - d_v, k_v\}
r e m v ← min { r e m u − d v , k v }
若当前在 u u u ,判定其子节点 v v v 可达的条件为 d v ≤ r e m u d_v \le \mathrm{rem}_u d v ≤ r e m u .
再记 d n u \mathrm{dn}_u d n u 表示危险度 ≤ d n u \le \mathrm{dn}_u ≤ d n u 的人可以从 r r r 走到 u u u .为了计算 d n u \mathrm{dn}_u d n u ,我们需要记录 s u s_u s u 表示 r r r 到 u u u 的路径上,除了 r r r 的所有节点的权值和.有转移:
d n v ← min { d n u , k v − s u m u } \mathrm{dn}_v \leftarrow \min\{\mathrm{dn}_u, k_v - \mathrm{sum}_u\}
d n v ← min { d n u , k v − s u m u }
那么相当于统计满足 a u ≤ a v a_u \le a_v a u ≤ a v 且 u p u ≤ d n v \mathrm{up}_u \le \mathrm{dn}_v u p u ≤ d n v 的点对 ( u , v ) (u, v) ( u , v ) 数目,是经典的二维数点问题,扫描线即可.总复杂度为 O ( n log 2 n ) O(n \log^2 n) O ( n log 2 n ) .
! C. 穿梭
还没补.
12 月 21 日
A. 指数爆炸
注意到幂塔只有前 30 个位置有用,故倒着 DP,转移只枚举前 30 个位置,后面的直接前缀和计算.
然后这 b 题卡常,注意到计算幂塔的模数除开前三个(分别为 998244353 , 998244352 , 402653184 998244353, 998244352, 402653184 9 9 8 2 4 4 3 5 3 , 9 9 8 2 4 4 3 5 2 , 4 0 2 6 5 3 1 8 4 )均为 2 2 2 的整数次幂,故使用位运算优化取模.时间复杂度 O ( n log 3 V ) O(n \log^3 V) O ( n log 3 V ) .
* B. 购物博弈
考虑对每个左端点 i i i 计算最小的 f i f_i f i ,使得给 [ i , f i ] [i, f_i] [ i , f i ] 这一段涨价后满足要求.答案即为 ∑ n − f i + 1 \sum n - f_i + 1 ∑ n − f i + 1 .
注意到 b i > a i b_i > a_i b i > a i ,故 f i f_i f i 单调增.考虑整体二分.设当前答案值域为 [ p l , p r ] [\mathrm{pl}, \mathrm{pr}] [ p l , p r ] ,对应 f f f 的下标值域为 [ l , r ] [l, r] [ l , r ] .令 p m i d = ⌊ ( p l + p r ) / 2 ⌋ \mathrm{pmid} = \lfloor (\mathrm{pl} + \mathrm{pr}) / 2 \rfloor p m i d = ⌊ ( p l + p r ) / 2 ⌋ ,考虑计算区间 [ l , r ] [l, r] [ l , r ] 中最大的 i i i 满足使 [ i , p m i d ] [i, \mathrm{pmid}] [ i , p m i d ] 涨价后满足题目要求.由于 f f f 有单调性,这个也可以二分!
复杂度貌似是 O ( n V log n ) O(nV \log n) O ( n V log n ) ,但是非常不满!跑得很快.
* C. 保守主义
垃圾东西.注意到字母对很少,考虑将询问离线,逐一计算每一对字母对询问的贡献.
对于字母对 ( c 1 , c 2 ) (c_1, c_2) ( c 1 , c 2 ) ,我们可以将序列中除了 c 1 c_1 c 1 和 c 2 c_2 c 2 的数去掉,然后将 c 1 c_1 c 1 变成 1 1 1 ,c 2 c_2 c 2 变成 0 0 0 ,即求端点间的连续段数.容易使用前缀和解决,时间复杂度 ( n ∣ Σ ∣ + m ∣ Σ ∣ 2 ) (n|\Sigma| + m|\Sigma|^2) ( n ∣ Σ ∣ + m ∣ Σ ∣ 2 ) .
12 月 24 日
* A. 学习小组
记数字 i i i 的出现次数为 c t i \mathrm{ct}_i c t i .对于参数 p p p ,答案由下式给出:
⌊ ∑ i min { c t i , c t p − i } 2 ⌋ \left\lfloor \frac{\sum_{i} \min\{\mathrm{ct}_i, \mathrm{ct}_{p - i}\}}{2} \right\rfloor
⌊ 2 ∑ i min { c t i , c t p − i } ⌋
考虑如何计算分子,发现是个卷积的形式.又注意到 c t i \mathrm{ct}_i c t i 的不同取值只有 O ( n ) O(\sqrt{n}) O ( n ) 种,故考虑枚举 x x x ,对所有 c t i = x \mathrm{ct}_i = x c t i = x 的 i i i 计算贡献.分子可转写成下式:
∑ x ∑ i [ c t i = x ] [ c t p − i ≤ x ] c t p − i + ∑ i [ c t i = x ] [ c t p − i > x ] c t i \sum_x \sum_{i} [\mathrm{ct}_i = x][\mathrm{ct}_{p - i} \le x] \mathrm{ct}_{p - i} + \sum_i [\mathrm{ct}_i = x][\mathrm{ct}_{p - i} > x] \mathrm{ct}_i
x ∑ i ∑ [ c t i = x ] [ c t p − i ≤ x ] c t p − i + i ∑ [ c t i = x ] [ c t p − i > x ] c t i
后两部分都是卷积的形式,使用 FFT 加速计算即可.
这样做的复杂度是 O ( n m log m ) O(\sqrt{n} m \log m) O ( n m log m ) ,过不去.
注意到我们还有个简单 O ( n 2 ) O(n^2) O ( n 2 ) 的暴力.考虑设置阈值 B B B ,c t \mathrm{ct} c t 中出现次数 ≤ B \le B ≤ B 的值跑暴力,这部分复杂度是 O ( ( n / B ) 2 ) O((n / B)^2) O ( ( n / B ) 2 ) ;c t \mathrm{ct} c t 中出现次数 > B > B > B 的值跑 FFT,这部分复杂度为 O ( B m log m ) O(B m \log m) O ( B m log m ) .视 n , m n, m n , m 同阶,取 B = O ( ( n / log n ) 1 / 3 ) B = O\left((n / \log n)^{1 / 3}\right) B = O ( ( n / log n ) 1 / 3 ) 平衡,复杂度 O ( n 4 / 3 log 2 / 3 n ) O(n^{4 / 3} \log^{2 / 3} n) O ( n 4 / 3 log 2 / 3 n ) .
* B. 树国路径普查
考虑分治,计算跨越分治区间中点的区间贡献.
设分治区间为 [ l , r ] [l, r] [ l , r ] ,终点为 m i d \mathrm{mid} m i d .对于 i ∈ [ l , m i d ] i \in [l, \mathrm{mid}] i ∈ [ l , m i d ] ,j ∈ ( m i d , r ] j \in (\mathrm{mid}, r] j ∈ ( m i d , r ] ,区间 [ i , j ] [i, j] [ i , j ] 的直径可能有三种贡献途径:全由 [ i , m i d ] [i, \mathrm{mid}] [ i , m i d ] 贡献,全由 ( m i d , j ] (\mathrm{mid}, j] ( m i d , j ] 贡献,剩下的称为跨 m i d \mathrm{mid} m i d 贡献.
通过画画画画画画可以发现,对于一个 i i i ,( m i d , r ] (\mathrm{mid}, r] ( m i d , r ] 可被划分成三部分:对于 j ∈ ( m i d , x ] j \in (\mathrm{mid}, x] j ∈ ( m i d , x ] ,[ i , j ] [i, j] [ i , j ] 的直径由 [ i , m i d ] [i, \mathrm{mid}] [ i , m i d ] 贡献;对于 ( x , y ] (x, y] ( x , y ] ,[ i , j ] [i, j] [ i , j ] 的直径属于跨 m i d \mathrm{mid} m i d 贡献;对于 j ∈ ( y , r ] j \in (y, r] j ∈ ( y , r ] ,[ i , j ] [i, j] [ i , j ] 的直径由 ( m i d , j ] (\mathrm{mid}, j] ( m i d , j ] 贡献.且随着 i i i 减小,x x x 和 y y y 都单调不降,使用两个指针维护.前两类贡献是好算的,考虑如何计算跨 m i d \mathrm{mid} m i d 贡献.
问题在于拼接两个区间的直径.注意到如果我们计算出点集的“半径”和“圆心”,点集并的直径长度等于两点集的半径和加上圆心间的距离.半径和容易维护,圆心间的距离造成的贡献形如某个点到区间所有点的距离和,使用 经典技巧 即可快速计算.
! C. 简单环检测
带卡时的暴力过了./qd
12 月 28 日
* A. Rick 的跨年晚会
设 f i , j f_{i, j} f i , j 表示从后往前考虑到了 i i i ,文艺值当前等于 l i l_i l i 的有 j j j 人.转移枚举下一个选 k k k ,有
{ f k , j + 1 ← f i , j + c l k − s k l k = l i f k , t + 1 ← f i , j + c l k − s k + t o t l k > l i \begin{cases}
f_{k, j + 1} \leftarrow f_{i, j} + c_{l_k} - s_k & l_k = l_i \\
f_{k, t + 1} \leftarrow f_{i, j} + c_{l_k} - s_k + \mathrm{tot} & l_k > l_i
\end{cases}
{ f k , j + 1 ← f i , j + c l k − s k f k , t + 1 ← f i , j + c l k − s k + t o t l k = l i l k > l i
其中 t t t 是 j j j 个人从 l i l_i l i “进位”到 l k l_k l k 所剩下的人数,t o t \mathrm{tot} t o t 是该过程中造成的贡献.由于每次进位除 2 2 2 ,故对于一个 j j j ,能取的 t t t 只有 log j \log j log j 种,开桶统计.t = 0 t = 0 t = 0 时的转移会影响到 k < i , l k ≥ l i k < i, l_k \ge l_i k < i , l k ≥ l i 的所有位置,开树状数组统计.
* B. 修剪仙人掌
先把每个环边上的颜色薅出来.由于每个环上至少要删一条边,故问题可以被写成一个匹配的形式:我们将每种颜色的边保留一条,然后让剩下的边和环上的颜色匹配.若匹配满了,那么存在一种不消耗颜色的删边方式,直接输出颜色数;若有环未被匹配,说明无论如何都要消耗一种颜色.故答案为 c − ( r − m ) c - (r - m) c − ( r − m ) ,其中 c c c 是颜色数,r r r 是环数,m m m 是匹配数.
直接建图跑网络流即可.由于是二分图,故时间复杂度 O ( n n ) O(n \sqrt{n}) O ( n n ) .
* C. 直径检查器
没写完代码. \Huge\color{red}\text{没写完代码.} 没写完代码.
tsukiotome.
12 月 31 日
A. 星战 II
考虑对排列中没有两个相邻元素在树上相邻这一条件容斥.问题转化为钦定排列中有 i i i 组元素在树上相邻,对这样的排列计数.注意到同组元素在树上一定构成一条链,故可以设 f u , i , 0 / 1 / 2 f_{u, i, 0 / 1 / 2} f u , i , 0 / 1 / 2 表示考虑 u u u 的子树中的元素,分 i i i 组,u u u 所在的组是单点 / 祖先链 / 形如 ∧ \land ∧ 的链.
注意链的方向需要计入方案.
* B. 木板街
我超,原 .
! C. 抵抗
还没补.
1 月 4 日
A. 奇数三角覆盖
我超,原 .
题解 .
! B. 能量树
只补了不需要 poly 算法的 70 分,即性质 A.
由于 q 1 = 1 q_1 = 1 q 1 = 1 ,故若存在一个 p i ≥ 1 p_i \ge 1 p i ≥ 1 ,那么答案就为 1 1 1 .
设 f x ( t ) = P ( x ≤ t ) f_x(t) = P(x \le t) f x ( t ) = P ( x ≤ t ) ,即 x ≤ t x \le t x ≤ t 的概率,其中 x x x 是一个随机变量.答案即为 1 − ∫ 0 1 f a 1 ( x ) d x 1 - \int_0^1 f_{a_1}(x) \mathrm{d}x 1 − ∫ 0 1 f a 1 ( x ) d x .
先考虑 max \max max 操作对 f f f 的影响.设 s = max { p , q } s = \max\{p, q\} s = max { p , q } ,有 f s ( x ) = P ( s ≤ x ) = P ( max { p , q } ≤ x ) = P ( p ≤ x ) P ( q ≤ x ) = f p ( x ) f q ( x ) f_s(x) = P(s \le x) = P(\max\{p, q\} \le x) = P(p \le x) P(q \le x) = f_p(x)f_q(x) f s ( x ) = P ( s ≤ x ) = P ( max { p , q } ≤ x ) = P ( p ≤ x ) P ( q ≤ x ) = f p ( x ) f q ( x ) .
再考虑 + + + 操作对 f f f 的影响,设 s = p + q s = p + q s = p + q ,其中 q q q 是在 [ 0 , r ] [0, r] [ 0 , r ] 中均匀随机的变量,有:
f s ( x ) = P ( p + q ≤ x ) = 1 r ∫ 0 r P ( p + t ≤ x ) d t = 1 r ∫ 0 r f p ( x − t ) d t f_s(x) = P(p + q \le x) = \frac{1}{r} \int_0^r P(p + t \le x) \mathrm{d}t = \frac{1}{r} \int_0^r f_p(x - t) \mathrm{d}t
f s ( x ) = P ( p + q ≤ x ) = r 1 ∫ 0 r P ( p + t ≤ x ) d t = r 1 ∫ 0 r f p ( x − t ) d t
若令 F p ( x ) F_p(x) F p ( x ) 为 f p ( x ) f_p(x) f p ( x ) 的原函数,那么有 f s ( x ) = 1 r ( F ( x − 0 ) − F ( x − r ) ) f_s(x) = \frac{1}{r} (F(x - 0) - F(x - r)) f s ( x ) = r 1 ( F ( x − 0 ) − F ( x − r ) ) ,又因为 q 1 = 1 q_1 = 1 q 1 = 1 ,故我们只需计算 f a 1 ( x ) f_{a_1}(x) f a 1 ( x ) 在 [ 0 , 1 ] [0, 1] [ 0 , 1 ] 上的积分,+ + + 操作的影响可直接写作 f s ( x ) = 1 r F p ( x ) f_s(x) = \frac{1}{r} F_p(x) f s ( x ) = r 1 F p ( x ) .
再考虑乘 k k k 操作对 f f f 的影响,设 s = k p s = kp s = k p ,显然有 f s ( x ) = f p ( x / k ) f_s(x) = f_p(x / k) f s ( x ) = f p ( x / k ) .
再考虑乘方操作对 f f f 的影响,设 s = p k s = p^k s = p k ,显然有 f s ( x ) = f p ( x 1 / k ) f_s(x) = f_p\left(x^{1 / k}\right) f s ( x ) = f p ( x 1 / k ) .
由于叶子上的 f f f 恒为 1 1 1 ,是一个单项式,上述的所有操作都不会增加项数,故所有结点的 f f f 都是单项式,直接计算即可.
注意到乘 k k k 和乘方不会同时出现,故可直接储存单项式指数模 998244353 998244353 9 9 8 2 4 4 3 5 3 的结果.
* C. 薪资分配
保序回归,先套个板子,问题转化为将 x x x 和 x + ϵ x + \epsilon x + ϵ 两个权值赋给节点,使得满足题目条件限制的同时最小化代价.可以通过 DP 完成,环上钦定一个节点的状态做两遍即可.
1 月 7 日
! A. 中位数表格
什么 b 东西.
* B. 最大流和哈密顿
我超,原 .
先建出等价流树,问题转化为:你需要给出一个首尾相接的排列,价值定义为 p i p_i p i 到 p i + 1 p_{i + 1} p i + 1 路径上最小值的和,最大化价值.
经过猜猜猜得出,所有树边都可以被取到,然后权值最小的边会被取到 2 2 2 次.
权值最小的边会被取到 2 2 2 次是因为,考虑将其权值最小的边断开,树被分成了两个连通块,不妨设分别为 S S S 和 T T T ,由于给出的是排列,肯定会有一个 i i i 满足 p i ∈ S p_i \in S p i ∈ S ,p i + 1 ∈ T p_{i + 1} \in T p i + 1 ∈ T ,这样就被经过了一次,又排列首尾相接,故必然还存在一个 j ≠ i j \not= i j = i ,满足 p j ∈ T , p j + 1 ∈ S p_j \in T, p_{j + 1} \in S p j ∈ T , p j + 1 ∈ S ,这样就至少会经过两次.
上述过程给我们了一个关于构造方案的启示:我们可以每次删除当前连通块内权值最小的边,这样就变成了两个子问题,递归做即可.
! C. 生成树转换
什么 b 东西.
1 月 11 日
A. 最大权值子序列
唐.直接上 AC 自动机就做完了.
* B. 基环树森林
考虑将贡献拆到边上,计算一条边 ( u , v , w ) (u, v, w) ( u , v , w ) 被计入答案的概率,乘 w w w 求和就是答案.
考虑求最大权生成基环森林的过程,我们可以将边按边权降序排序,贪心选取.边 ( u , v , w ) (u, v, w) ( u , v , w ) 能被选取的情况有 2 2 2 种:
u u u 和 v v v 在一个联通块内,且该联通块是树.
u u u 和 v v v 不在一个联通块内.设 u u u 所在的连通块是 S S S ,v v v 所在的连通块是 T T T ,显然 S S S 和 T T T 只能是树或者基环树,且不能同时是基环树.
那么 ( u , v , w ) (u, v, w) ( u , v , w ) 能被计入答案的概率就是出现上述两种情况的选边方案数除总方案数.
联通块是基环树这一条件并不方便刻画,考虑计算反面,即 ( u , v , w ) (u, v, w) ( u , v , w ) 不能被选取的概率.条件变为:
u u u 和 v v v 在一个联通块内,且该联通块不是树.
u u u 和 v v v 不在一个联通块内,且两联通块都不是树.
条件里只剩联通和树了,又我们只关心权值比 w w w 大的边,故将剩下的边踢掉.可以设 f S f_S f S 表示点集 S S S 构成一棵树的选边方案数,g S g_S g S 表示使点集 S S S 联通的选边方案数.记点集 S S S 内部的边个数为 c S c_S c S ,这个可以简单 SoS-DP 求出.枚举 S S S 中编号最小的点所在的点集 T T T ,有转移:
f S = 1 ∣ S ∣ − 1 ∑ T f T f S − T ( c S − ( c T + c S − T ) ) g S = 2 c S − ∑ T 2 c S − T g T \begin{aligned}
f_S &= \frac{1}{|S| - 1} \sum_T f_T f_{S - T} (c_S - (c_T + c_{S - T})) \\
g_S &= 2^{c_S} - \sum_T 2^{c_{S - T}} g_T \\
\end{aligned}
f S g S = ∣ S ∣ − 1 1 T ∑ f T f S − T ( c S − ( c T + c S − T ) ) = 2 c S − T ∑ 2 c S − T g T
f f f 的转移中 1 ∣ S ∣ − 1 \frac{1}{|S| - 1} ∣ S ∣ − 1 1 系数的含义是,每棵树都会被每条边统计一次,故重复了 ∣ S ∣ − 1 |S| - 1 ∣ S ∣ − 1 次,减去即可.
于是我们可以在 O ( 3 n ) O(3^n) O ( 3 n ) 的复杂度内计算出 f f f 和 g g g ,令 U U U 为点的全集,( u , v , w ) (u, v, w) ( u , v , w ) 能被计入答案的概率为:
1 2 ( 1 − 1 2 c U ( ∑ u , v ∈ S 2 c U − S ( g S − f S ) + ∑ u ∈ S v ∉ S ∑ T ⊆ U − S v ∈ T 2 c U − S − T ( g S − f S ) ( g T − f T ) ) ) \frac{1}{2} \left(1 - \frac{1}{2^{c_U}} \left(\sum_{u, v \in S} 2^{c_{U - S}} (g_S - f_S) + \sum_{\substack{u \in S \\ v \not\in S}} \sum_{\substack{T \subseteq U - S \\ v \in T}} 2^{c_{U - S - T}} (g_S - f_S) (g_T - f_T)\right)\right)
2 1 ⎝ ⎜ ⎜ ⎛ 1 − 2 c U 1 ⎝ ⎜ ⎜ ⎛ u , v ∈ S ∑ 2 c U − S ( g S − f S ) + u ∈ S v ∈ S ∑ T ⊆ U − S v ∈ T ∑ 2 c U − S − T ( g S − f S ) ( g T − f T ) ⎠ ⎟ ⎟ ⎞ ⎠ ⎟ ⎟ ⎞
! C. 化石树
口胡了一下,不知道对不对.
首先我们有无根树哈希,可以快速判断两个无标号无根树是否相同,做法就是选重心为根哈希,若有两个重心就都哈希一遍,然后随便你保留小的或者异或到一起.
设第一遍删完后的图为 S S S ,第二遍删完后的图为 T T T ,考虑如何判定 S S S 中的某个点是否是 B B B .我们可以直接将删去它后的所有连通块都做一遍无根树哈希,显然 T T T 中只会有一个连通块不会出现在这之中.找到 A A A 和 B B B 后将边补全即可.
1 月 14 日
* A. 随机抽样
首先先进行一个 Min-Max 容斥,设随机变量 x i x_i x i 为 i i i 第一次被抽样的轮数,要求的就是 E ( max x i ) E(\max x_i) E ( max x i ) ,根据 Min-Max 容斥有:
E ( max x i ) = ∑ S ( − 1 ) ∣ S ∣ + 1 E ( min i ∈ S x i ) E(\max x_i) = \sum_S (-1)^{|S| + 1} E\left(\min_{i \in S} x_i\right)
E ( max x i ) = S ∑ ( − 1 ) ∣ S ∣ + 1 E ( i ∈ S min x i )
考虑如何对所有子集 S S S 求 E ( min i ∈ S x i ) E(\min_{i \in S} x_i) E ( min i ∈ S x i ) ,若我们求出了一轮没抽到 S S S 中元素的概率 p S p_S p S ,由于每轮流程一致,那么有 E ( min i ∈ S x i ) = 1 + p S / ( 1 − p S ) E(\min_{i \in S} x_i) = 1 + p_S / (1 - p_S) E ( min i ∈ S x i ) = 1 + p S / ( 1 − p S ) .
考虑如何计算取得长度为 m m m 的子序列 r 1 , r 2 , ⋯ , r m r_1, r_2, \cdots, r_m r 1 , r 2 , ⋯ , r m 的概率,首先 r 1 r_1 r 1 的选取贡献了 1 / n 1 / n 1 / n ,然后对于 i > 1 i > 1 i > 1 ,r i r_i r i 被选出的概率为 1 / ( n − r i − 1 ) 1 / (n - r_{i - 1}) 1 / ( n − r i − 1 ) ,又 r m = n r_m = n r m = n .故有:
p S = 1 n ∏ i ∈ U − S i ≠ n 1 n − i p_S = \frac{1}{n} \prod_{\substack{i \in U - S \\ i \not= n}} \frac{1}{n - i}
p S = n 1 i ∈ U − S i = n ∏ n − i 1
然后就直接按照容斥式子计算即可.
* B. 出租车司机
先考虑如何做 0 ≤ s ≤ t 0 \le s \le t 0 ≤ s ≤ t 的那一个包,发现我们只需要经过 t t t 即可.一个经典转化是将这个游走放在网格图上,那么终点 ≥ t \ge t ≥ t 的路径肯定满足要求,这部分路径数是
∑ i ≥ t ( n i ) \sum_{i \ge t} \binom{n}{i}
i ≥ t ∑ ( i n )
现在考虑计算越过 t t t 后又回到 t t t 下方的路径,不妨设终点为 p p p ,我们将这样的路径在第一次碰到 t t t 之后的部分翻折,终点变为 2 t − p 2t - p 2 t − p ,不难发现翻折后到 2 t − p 2t - p 2 t − p 的一条路径和翻折前的路径构成双射.故这部分路径数为
∑ i < t ( n 2 t − i ) \sum_{i < t} \binom{n}{2t - i}
i < t ∑ ( 2 t − i n )
预处理组合数前缀和即可计算.
对于 s > t s > t s > t 的部分,不妨将 s s s 关于 t t t 对称一下,这样的路径和计数对象也构成双射,然后又变回了上面的问题,直接算即可.
! C. 矩阵权值
什么 b 东西.
1 月 18 日
! A. 空间饮料站
* B. 博弈游戏
设 f x f_x f x 表示最终得分 ≥ x \ge x ≥ x 的局面数目,答案即为 ∑ f i \sum f_i ∑ f i .
考虑如何计算 f x f_x f x ,不妨令 v a l \mathrm{val} v a l 中 ≥ x \ge x ≥ x 的数设为 1 1 1 ,< x < x < x 的数设为 0 0 0 ,博弈操作不变.不妨处理出将值修改成 01 01 0 1 后所有局面的博弈结果,设值为 1 1 1 的下标集合 S S S ,此时的博弈结果为 g S g_S g S ,那么答案可写作:
∑ i = 1 m ∑ S g S ( m − i + 1 ) ∣ S ∣ ( i − 1 ) n − ∣ S ∣ = ∑ S g S ∑ i = 1 m ( m − i + 1 ) ∣ S ∣ ( i − 1 ) n − ∣ S ∣ \sum_{i = 1}^m \sum_S g_S (m - i + 1)^{|S|} (i - 1)^{n - |S|} = \sum_S g_S \sum_{i = 1}^m (m - i + 1)^{|S|} (i - 1)^{n - |S|}
i = 1 ∑ m S ∑ g S ( m − i + 1 ) ∣ S ∣ ( i − 1 ) n − ∣ S ∣ = S ∑ g S i = 1 ∑ m ( m − i + 1 ) ∣ S ∣ ( i − 1 ) n − ∣ S ∣
后面那个 ∑ \sum ∑ 可以单次 O ( n 2 ) O(n^2) O ( n 2 ) 插值计算.
但是枚举大小为 n n n 的集合的子集仍然不可接受.发现左右两部分,除开同时出现的值,是独立的,故分开考虑前后两半,枚举同时出现的值,然后再分开枚举左右两边出现的值的状态,注意到我们的贡献系数只和 ∣ S ∣ |S| ∣ S ∣ 有关,故记录两边 ∣ S ∣ = i |S| = i ∣ S ∣ = i 方案后做个卷积即可.又注意到第一步决策由 Alice 做出,故我们只关心两边博弈结果为 1 1 1 的方案.
! C. 旅行卡比兽
1 月 21 日
* A. 中忍考试
对 n n n 的所有取值分类讨论.
n = 1 n = 1 n = 1 时
此时你无法区分每道题目,故此时直接讨论是否和给定的人反选即可.
n = 2 n = 2 n = 2 时
此时第二个人和第一个人选择不同的题目和选择相同的题目可以被区分,故设 c 0 , c 1 c_0, c_1 c 0 , c 1 分别表示两种题目的个数,x 0 , x 1 x_0, x_1 x 0 , x 1 表示两种题目中第一个人正确的数目.有方程
x 0 + x 1 = s 1 c 0 − x 0 + x 1 = s 2 \begin{aligned}
x_0 + x_1 &= s_1 \\
c_0 - x_0 + x_1 &= s_2
\end{aligned}
x 0 + x 1 c 0 − x 0 + x 1 = s 1 = s 2
容易解出 x 0 , x 1 x_0, x_1 x 0 , x 1 .同样的,每种题目的决策确定,我们可以算出某种题目答案与第一个人相同的局面数 x x x 和与第一个人不同的局面数 y y y ,一道这种题目对最大期望的贡献就是 max { x , y } x + y \frac{\max\{x, y\}}{x + y} x + y m a x { x , y } .
n = 3 n = 3 n = 3 时
和 n = 2 n = 2 n = 2 类似,不过此时有 4 4 4 个未知数,但只有 3 3 3 个方程,故需枚举一个值再计算方案.
对于更一般的情况,采取这个做法会导致需要解一个 2 n − 1 2^{n - 1} 2 n − 1 个未知数,n n n 个方程的方程组,显然寄了.
* B. 染色游戏
我草这 jb 啥啊?
首先不知道为什么题目中给出的图是平面三角剖分图,然后由四色定理可知,色数 ≤ 4 \le 4 ≤ 4 .
我们只需对色数等于 1 , 2 , 3 1, 2, 3 1 , 2 , 3 的区间计数即可.对色数为 1 1 1 的区间计数是平凡的,就是区间长度.
然后我们发现,随着区间增长,色数单调不降.故我们可以计算出 m x 2 r i \mathrm{mx2r}_i m x 2 r i 表示最大的 j j j 满足 [ i , j ] [i, j] [ i , j ] 色数为 2 2 2 ,m x 3 r i \mathrm{mx3r}_i m x 3 r i 表示最大的 j j j ,使得 [ i , j ] [i, j] [ i , j ] 色数为 3 3 3 ,那么问题可以转化为单点加区间历史和,扫描线即可维护.
m x 2 r i \mathrm{mx2r}_i m x 2 r i 是容易计算的,就是 i i i 开始的极长单调区间长度.考虑计算 m x 3 r i \mathrm{mx3r}_i m x 3 r i ,我们不加证明地抛出一个引理:
一个平面三角剖分图是可以被 3-染色的,当且仅当它的面可被 2-染色.
而这个条件又等价于,平面嵌入中不与外部面相接的顶点度数均为偶数.不与外部面相接的顶点即为前后第一个大于 / 小于它的点都已经和它连边的点,容易双指针维护.
上述引理证明的讨论可见这个链接:Link .
* C. 01-Game
首先,由于 1 1 1 的个数不变,不妨设分别为 c 1 , c 2 c_1, c_2 c 1 , c 2 ,若答案中 1 1 1 的个数为 x x x ,答案可写作:x + ( k − x − ( c 1 − x ) − ( c 2 − x ) ) = k − c 1 − c 2 + 2 x x + (k - x - (c_1 - x) - (c_2 - x)) = k - c_1 - c_2 + 2x x + ( k − x − ( c 1 − x ) − ( c 2 − x ) ) = k − c 1 − c 2 + 2 x ,故最大化 x x x 即可.
将每个操作看成一个置换,序列 a a a 操作 [ l , r ] [l, r] [ l , r ] 后与序列 b b b 求交可看作序列 a a a 顺序应用 [ l , r ] [l, r] [ l , r ] 内的置换后与 b b b 求交,等价于序列 a a a 操作 [ l , n ] [l, n] [ l , n ] 后于序列 b b b 操作 [ r + 1 , n ] [r + 1, n] [ r + 1 , n ] 后求交,故可以算出顺序应用每个后缀的置换后的局面.
设 f S f_S f S 为 a a a 到达局面 S S S 的最长后缀的开始位置,g S g_S g S 表示 b b b 到达局面 S S S 的最短后缀的开始位置.通过 SoS-DP 将其贡献到子集上,枚举交集判定是否满足区间长度 ≥ m \ge m ≥ m 的条件,若满足更新答案即可.
1 月 25 日
* A. 成环
考虑如何对某一个 x x x 求答案,容易发现原环被 = x = x = x 的元素划分成了若干段,显然每段的方案独立,分开求解后求和即可.
考虑只由 < x < x < x 和 > x > x > x 的元素组成的连续段,显然操作数至少是段长,我们考虑需要再哪些部分多花费操作.考虑将连续段中值为 v v v 的元素重新赋值为 [ v > x ] [v > x] [ v > x ] ,显然不影响操作.记重新赋值后的连续段为 f i f_i f i ,那么考虑每个 0 / 1 0 / 1 0 / 1 连续段,在每段的末尾(即满足 f i ≠ f i + 1 f_i \not= f_{i + 1} f i = f i + 1 的位置)会产生一次额外操作.故不妨记 g i = [ f i ≠ f i + 1 ] g_i = [f_i \not= f_{i + 1}] g i = [ f i = f i + 1 ] ,答案就是 g g g 中 1 1 1 的个数…吗?
事实上 g g g 中 1 1 1 的一个长度为 l l l 连续段的代价是 ⌈ l / 2 ⌉ \lceil l / 2 \rceil ⌈ l / 2 ⌉ .这样的段对应着 f f f 数组中一段 0 / 1 0 / 1 0 / 1 交错段,可以对其中的 0 0 0 或 1 1 1 元素进行操作来合并成一个 0 / 1 0 / 1 0 / 1 连续段.
然后发现这玩意可以上线段树就做完了.
! B. 断键
* C. 隧穿
注意到 h e i g h t \mathrm{height} h e i g h t 的限制实际上是钦定了某两个后缀的 LCP 长度,即钦定某两个子串相等.
考虑在原串上限制 i i i 和 j j j 相等,由于 s a i \mathrm{sa}_i s a i 已知,我们可以求出 r k i \mathrm{rk}_i r k i .那么排名处在 r k i \mathrm{rk}_i r k i 和 r k j \mathrm{rk}_j r k j 之间的所有后缀的第一个字符也必定相等,这导出了一个在后缀序上的一个区间内部字符全部相同的限制,考虑差分一下.钦定两个子串相等就再差分一下.
再考虑构造字典序最小的串,对于某个 i i i ,当 h e i g h t i = − 1 \mathrm{height}_i = -1 h e i g h t i = − 1 时,若有 r k s a i + 1 ≤ r k s a i − 1 + 1 \mathrm{rk}_{\mathrm{sa}_i + 1} \le \mathrm{rk}_{\mathrm{sa}_{i - 1} + 1} r k s a i + 1 ≤ r k s a i − 1 + 1 ,此时有为了满足 s a i \mathrm{sa}_i s a i 的定义(排名为 i i i 的后缀的起始位置),s s a i > s s a i − 1 s_{\mathrm{sa}_i} > s_{\mathrm{sa}_{i - 1}} s s a i > s s a i − 1 ,否则可以取等.
1 月 28 日
! A. 石化
! B. 致盲
C. 凝滞
我超,原 .
2 月 6 日
A. 手刃
显然边双内的边都能无条件断开,其他的边断了一定不优秀(会舍弃边双树子树中的点),故答案就是只走割边的联通块个数.
! B. 降服
* C. 重创
首先题意转化后就是要你做异或 ( min , + ) (\min, +) ( min , + ) 卷积.
我们有非常好数据随机保证,故打个表先.发现数组中不同的值很少!!!111
发现一个方案若能凑出来 x x x ,那么就能够凑出所有 ≤ x \le x ≤ x 的数,故一个新方案的影响形如前缀取 min \min min .所以不同的值组成递增连续段,暴力维护这些连续段即可.
压力给到如何快速求得 x x x 与 ≤ y \le y ≤ y 的数异或能凑到的最大值.发现 x and y x \operatorname{and} y x a n d y 的最高位 1 1 1 及以下的所有位置都能通过构造方案填 1 1 1 ,高于最高位的直接 or \operatorname{or} o r 即可.