杂题汇总(2022-2023.02.16)

Problems - 杂题汇总(2022-2023.02.16)

目录

2023.02.16 之前的所有杂题的汇总

LG-P3803 【模板】多项式乘法(FFT)

日期:2022.08.22

算法:FFT

难度:V

题面:多项式乘法模板。

题解:FFT 模板。

LG-P3803 【模板】多项式乘法(FFT)

日期:2022.08.22

算法:NTT

难度:VI

题面:多项式乘法模板。

题解:大于 $ 9^2 \times 10^6 $ 模数的NTT。

LG-P2704 [NOI2001] 炮兵阵地

日期:2022.08.23

算法:状压DP

难度:IV

题面:在有障碍的矩阵图上放置影响范围为四个方向各延申2的点,问最大能放多少个。

题解:令 $ dp(i, j, k) $ 表示计算到第 $ i $ 行,当前行状态为 $ j $,上一行状态为 $ k $,最大可以放的个数,预处理每一行可能合法的状态,DP 时判断列的合法性。

LG-P1879 [USACO06NOV]Corn Fields G

日期:2022.08.23

算法:状压DP

难度:IV

题面:简化的炮兵阵地。

题解:思路与炮兵阵地类似

LG-P1896 [SCOI2005] 互不侵犯

日期:2022.08.23

算法:状压DP

难度:V

题面:加强版的1896,给出需要放的点数求方案数。

题解:显然需要一维记录已选择的国王数,令 $ dp(i, j, k) $ 表示计算到第 $ i $ 行,已经放置 $ j $ 个国王,当前行状态为 $ k $,然后枚举 $ i $ 和 $ k $ 以及上一行的 $ j $ 和 $ k $。

LG-P3377 【模板】左偏树(可并堆)

日期:2022.08.23

算法:可并堆

难度:V

题面:左偏树可并堆+并查集模板。

题解:左偏树模板,Merge 或 Delete 后用并查集维护父子关系。

LG-P1344 [USACO4.4]追查坏牛奶Pollutant Control

日期:2022.08.24

算法:网络流

难度:VI

题面:Exam

题解:Exam

LG-P1533 可怜的狗狗

日期:2022.08.25

算法:主席树

难度:V

题面:Exam

题解:Exam

JSK-42386 Function!

日期:2022.08.25

算法:数学

难度:VI

题面:Function!

题解:Function!

LG-P3369 【模板】普通平衡树

日期:2022.08.26

算法:Treap

难度:VI

题面:平衡树模板。

题解:带旋Treap实现。

LG-P5285 [十二省联考 2019] 骗分过样例

日期:2022.09.20

算法:莫比乌斯函数 原根 数学 MillerRabin

难度:VIII

题面:各种较为基础的操作融合在一起。

题解:Solution

LG-P3879 [TJOI2010] 阅读理解

日期:2022.09.20

算法:STL Trie

难度:III

题面:给你一些词组成文章,问词在哪些文章出现过。

题解:可以写 Trie,更简单的是直接 map 套 set。

LG-P8306 【模板】字典树

日期:2022.09.20

算法:Trie

难度:III

题面:Trie 模板。

题解:Trie 模板。

LG-P3478 [POI2008] STA-Station

日期:2022.09.20

算法:换根DP

难度:IV

题面:换根DP模板,求不同点为根时深度。

题解:标准换根DP,两次搜索即可。

Exam-2022.09.21

日期:2022.09.21

算法:Exam

难度:\

题面:Exam

题解:Exam

LG-P3865 【模板】ST 表

日期:2022.09.21

算法:ST表

难度:IV

题面:ST表模板。

题解:ST表模板。

LG-P3379 【模板】最近公共祖先(LCA)

日期:2022.09.22

算法:LCA(Tarjan)

难度:III

题面:LCA模板。

题解:Tarjan解决,LCA模板。

LG-P3379 【模板】最近公共祖先(LCA)

日期:2022.09.22

算法:LCA(倍增)

难度:III

题面:LCA模板。

题解:倍增解决,LCA模板。

JDOJ-2785 商之和

日期:2022.09.22

算法:数论分块

难度:III

题面:数论分块模板。

题解:数论分块模板。

JDOJ-2786 余之和

日期:2022.09.22

算法:数论分块

难度:IV

题面:数论分块模板plus。

题解:数论分块时快速乘防止爆 long long,求和时用一下逆元。

UVA-11526 H(n)

日期:2022.09.22

算法:数论分块

难度:III

题面:就是商之和。。。

题解:双倍经验。

LG-P2257 YY的GCD

日期:2022.09.22

算法:莫比乌斯反演

难度:VI

题面:标准莫反推式子。

题解:比较常规的套路的莫反。

LG-P3455 [POI2007]ZAP-Queries

日期:2022.09.22

算法:莫比乌斯反演

难度:V

题面:比 2257 更简单的莫反。

题解:套路莫反。

LG-P2522 [HAOI2011]Problem b

日期:2022.09.22

算法:莫比乌斯反演

难度:V

题面:3455 的加强版,给定区间而不是从 $ 1 $ 开始。

题解:和 3455 差别不大,套个简单的容斥即可。

LG-P1403 [AHOI2005]约数研究

日期:2022.09.22

算法:数论分块

难度:III

题面:求因数个数和。

题解:简单推一下就行,很水的数论分块。

LG-P2260 [清华集训2012]模积和

日期:2022.09.23

算法:数论分块

难度:模积求和。

题面:把模运算展开为乘除法之后常规数论分块即可,需要注意的细节较多。

题解:VI

LG-P1447 [NOI2010] 能量采集

日期:2022.09.23

算法:莫比乌斯反演

难度:求 $ \gcd $ 的和。

题面:把模运算展开为乘除法之后常规数论分块即可,需要注意的细节较多。

题解:VI

LG-P4318 完全平方数

日期:2022.09.24

算法:容斥

难度:VII

题面:求第 $ k $ 个不含平方因子的数。

题解:二分答案,容斥求出从 $ 1 $ 开始的不含平方因子的数的个数。

LG-P8546 小挖的 X 献身

日期:2022.09.26

算法:搜索 模拟

难度:III

题面:$ 01 $ 方阵中找 $ X $ 型。

题解:嗯搜模拟即可。

LG-P6175 无向图的最小环问题

日期:2022.09.27

算法:最小环

难度:III

题面:Floyd 求最小环。

题解:跑 Floyd 的时候枚举由 $ k $ 和小于 $ k $ 的点可能构成的环。

LG-B3611 【模板】传递闭包

日期:2022.09.27

算法:传递闭包

难度:III

题面:Floyd 求传递闭包。

题解:跑 Floyd 的时候取最小值改为取或,取和改为取与即可,可以 bitset 优化。

LG-P1989 无向图三元环计数

日期:2022.10.03

算法:三元环计数

难度:

题面:求无向图中三元环数。

题解:将无向图定向,从度数由小到大连,度数相同的编号由小到大连,然后枚举所有点,标记其连接的节点为该节点,枚举子节点的子节点,若已被标记为该节点则答案数 $ +1 $。

LG-P5970 [POI2016]Nim z utrudnieniem

日期:2022.10.10

算法:NIM游戏 DP

难度:VII

题面:将石子去掉 d 的倍数堆后进行 NIM 游戏,求去掉的方案数。

题解:NIM 游戏的结论:每堆石子数异或和为 $ 0 $ 则后手必胜,利用此性质设状态 $ dp(i, j, k) $ 表示前 $ i $ 个里选择 $ \xi \bmod{d} = j $ 个异或和为 $ k $ 的方案数,然后因为一个数和比它小的数异或之后不会大于最接近且大于它的 $ 2^\epsilon $,升序排列后根据总石子数可证复杂度正确,然后滚动数组压一下空间。

LG-P3531 [POI2012]LIT-Letters

日期:2022.10.10

算法:树状数组 逆序对

难度:V

题面:给定两个只有大写字母的字符串 $ A, B $,每次可以交换 $ A $ 中任意两个字符,求最少交换次数使 $ A, B $ 相同,保证有解。

题解:记录一下在 $ B $ 中每个字符第 $ i $ 次出现的位置,将 $ A $ 中每个字符变为在 $ B $ 中第 $ i $ 次出现的位置,然后对于最后的位置数组做一遍树状数组求逆序对即可,复杂度 $ O(n \log n) $,也可以开 $ 26 $ 个头指针表示对应字符在 $ B $ 中未使用的最新出现的位置,维护这个最后的复杂度应为 $ O(26n) $,套个平衡树然后区间维护最后复杂度为 $ O(n \log 26) $。

LG-P1966 [NOIP2013 提高组] 火柴排队

日期:2022.10.10

算法:树状数组 逆序对

难度:IV

题面:给定两个序列,用最少的操作次数使第一个序列和第二个序列相同,求操作次数。

题解:算是 LG-P3531 的弱化版,记录一下前者在后者中的位置然后把位置求个逆序对即可。

LG-P4220 [WC2018]通道

日期:2022.10.11

算法:虚树分治 爬山

难度:VI

题面:给定三棵树,选择一个起点和终点,最大化在三个树中的路径长度和,输出最大值。

题解:虚树分治不可能的,随机选择一个起点找到最优值的终点再将其作为起点,数次之后再随机新的起点,加个卡时即可过。对于 Hack 数据,先跑十遍左右原来的思路,然后仅考虑三棵树中某几棵树状态跑一遍爬山,写个类似枚举子集的东西即可,中间加个卡时超时直接结束程序,即可通过全部网站上的全部数据。

LG-P5956 [POI2017]Podzielno

日期:2022.10.11

算法:性质

难度:V

题面:给定 $ B $ 进制数中每个数出现的次数,要求组成一个最大的 $ B $ 进制数 $ X $,使得其为 $ B - 1 $ 的倍数,$ Q $ 次询问输出其以第 $ 0 $ 位为起始的第 $ k $ 位是什么。

题解:存在一个性质:$ B $ 进制下能被 $ B - 1 $ 整数的数,各位数字加和整除 $ B - 1 $,将其按 $ B $ 进制拆分后分别取模即可证明。于是记录 $ B $ 进制下 $ i $ 的个数,然后将整各位数字加和,若 $ tot \bmod{B - 1} $ 不为 $ 0 $ 则对应的值的数去掉一个,这样得到的数一定是最大的,二分找到第 $ k + 1 $ 个数即可。

LG-P5957 [POI2017]Flappy Bird

日期:2022.10.11

算法:性质

难度:V

题面:Flappy Bird 游戏,求到达 $ X $ 最少的向上飞次数。

题解:维护一个能到达的区间的上下端点,通过两个障碍物之间的距离可以直到前者的限制,和后者比较,同时判断奇偶性即可,注意最后一段会使最终的位置再向下一段。

CF915E Physical Education Lessons

日期:2022.10.12

算法:线段树 动态开点

难度:V

题面:动态开点线段树模板题。

题解:动态开点线段树模板题。

SP685 SEQPAR - Partition the sequence

日期:2022.10.12

算法:线段树 动态开点 DP

难度:VII

题面:给定 $ n $ 个数的数列 $ a_n $,给定 $ k $,将数列分成 $ k $ 段,满足每一段的元素和不大于 $ m $,求最小的 $ m $。

题解:Solution-SP685

CF896C Willem, Chtholly and Seniorious

日期:2022.10.13

算法:ODT

难度:V

题面:ODT 模板。

题解:ODT 模板。

LG-P4344 [SHOI2015]脑洞治疗仪

日期:2022.10.13

算法:线段树 ODT

难度:VI

题面:比较简单的 ODT,不过存在 ODT 的 Hack 数据。

题解:在普通 ODT 的基础上考虑如果连续的 $ 01 $ 串很长且结尾很接近 $ n $,那么我们就可以认为整个序列都是一个 $ 01 $ 串,然后以此直接输出答案便可用不正确的方法过掉这道线段树的题。

LG-P7972 [KSN2021] Self Permutation

日期:2022.10.14

算法:DP 单调栈 树状数组

难度:VI

题面:排列 $ A_n $ 中进行若干次操作,每次删去相邻两个数较大的那个,求最终可能得到的序列数量。

题解:把每个点建立一个区间,左右分别是第一个比它小的数的位置向中心移动一位,用单调栈从左到右从右到左各自维护一遍,令 $ dp(i) $ 表示以 $ a_i $ 结尾有多少种可能的最终排列,转移就是从 $ j \lt i $ 种找到所有 $ i $ 和 $ j $ 的区间有交的来求和,这个东西可以用树状数组维护一下,最终复杂度 $ O(n \log n) $,可以通过。

LG-P4396 [AHOI2013]作业

日期:2022.10.14

算法:莫队 值域分块

难度:V

题面:对于正整数序列 $ A_n $,每次求区间 $ \left[ l, r \right] $ 内值域在 $ \left[ a, b \right] $ 的数和数值个数。

题解:通过莫队维护区间 $ \left[ l, r \right] $ 的答案,具体的答案维护套一个值域分块,实现起来确实不难,细节也不是很多。

AT5140 [AGC035C] Skolem XOR Tree

日期:2022.10.14

算法:构造 异或

难度:VI

题面:构造一棵有 $ 2n $ 节点的树,对于节点 $ i $ 和 $ i + n $ 记值为 $ i $,要求满足任意 $ i $ 和 $ i + n $ 之间的路径的值异或起来为 $ i $。

题解:首先显然若 $ n = 2^t $,或者说 $ n = \operatorname{lowbit}(n) $,那么显然无解。考虑到对于 $ \forall i \in \left[ 2, n - 1 \right] $ 且 $ 2 \mid i $,有 $ i \oplus 1 \oplus (i + 1) \oplus i = i $,对于 $ i + 1 $ 同理,所以可以以 $ 1 $ 为根,在 $ 1 $ 上挂两个链,$ i \rightarrow i + 1 \(,\) i + 1 + n \rightarrow i + n $。然后考虑把 $ 1 + n $ 挂在 $ 3 $ 或者 $ 2 + n $ 上即可,这个很显然。然后若 $ 2 \mid n $,对于最后剩下的 $ n $,挂一条 $ n \rightarrow \operatorname{lowbit}(n) + 1 + n \rightarrow 1 \rightarrow n - \operatorname{lowbit}(n) \rightarrow n + n $ 的链即可。

LG-P3503 [POI2010]KLO-Blocks

日期:2022.10.17

算法:性质 单调栈 双指针

难度:V

题面:对于 $ n $ 个正整数的序列 $ a_n $,给定 $ k $,每次操作选择大于 $ k $ 的 $ a_i $,使 $ a_i \leftarrow a_i - 1 $,然后会使 $ a_{i - 1} \leftarrow a_{i - 1} + 1 $ 或 $ a_{i + 1} \leftarrow a_{i + 1} + 1 $。求任意次操作后最大能选出多长的子串满足每个数都不小于 $ k \(,\) T $ 组询问。

题解:首先问题显然可以转化为,找一段最长的区间,满足区间的平均数大于等于 $ k $。然后再转化为把每个数减去 $ k $,然后要找最长的一段区间,满足区间加和大于 $ 0 $。再转化为前缀和后就是要找最长的一段 $ s_j - s_i \ge 0 $,显然 $ O(n^2) $ 枚举会寄,考虑单调栈,对于左端点,显然若有 $ i \lt j \land s_i \le s_j $ 那么 $ i $ 一定优于 $ j $,或者说一定不会选择到 $ j $,证明显然。于是单调栈维护左端点,单调递减,右端点单调递增,这样可以对于每个左端点二分右端点,反之亦然,复杂度 $ O(Q n \log n) $ 不正确。考虑维护左端点的单调栈后,对于右端点从 $ n $ 向 $ 1 $ 枚举,若 $ s_i \ge 0 $ 那么 $ [0, i] $ 一定合法,否则考虑如果当前点符合右端点单调栈的规则,那么开始和左端点的单调栈相匹配,然后左端点出栈,并更新答案,显然这里出栈的左端点一定在后面不会再用到了。

LG-P5960 【模板】差分约束算法

日期:2022.10.17

算法:差分约束

难度:IV

题面:差分约束模板。

题解:将 $ x_i \le x_j + v $ 转换为从 $ j $ 到 $ i $ 的权值为 $ v $ 的边,然后建立一个超级源点,向所有点连一条 $ 0 $ 的边,然后 SPFA 跑一遍最短路,有负环则无解,否则 $ dis $ 则为一组合法解,这样求出的是 $ \le 0 $ 的最大解,超级源点的边设为 $ \omega $ 则为 $ \le \omega $ 的最大解。反之把建边反过来,边权设负,然后 SPFA 跑最长路,判断是否有正环即可。

LG-P5104 红包发红包

日期:2022.10.18

算法:概率与期望

难度:IV

题面:给定 $ \omega $ 和 $ k $,共有 $ \omega \(,\) k $ 个人每人在剩余中等概率拿走一定值,求第 $ k $ 人拿到值的期望。

题解:LG-P5104 红包发红包 Solution

$ \int_o^\omega \dfrac{x}{\omega}dx = \dfrac{\omega}{2} $,所以第 $ k $ 个人的期望为 $ \dfrac{\omega}{2^k} $。

LG-P7961 [NOIP2021] 数列

日期:2022.10.18

算法:DP

难度:VII

题面:给定 $ n, m, k $ 和长度为 $ m + 1 $ 的正整数数组 $ v_0, v_1, \cdots, v_m $,定义长度为 $ n $ 的下标从 $ 1 $ 开始的元素均不超过 $ m $ 的非负整数序列 $ a_n $,定义其权值为 $ v_{a_1} \times v_{a_2} \times \cdots \times v_{a_n} $,当这个序列满足 $ S = 2^{a_1} + 2^{a_2} + \cdots + 2^{a_n} $ 的二进制中 $ 1 $ 的数量不超过 $ k $ 时认为其时合法的,求所有合法序列的权值和取模。

题解:考虑令 $ dp(i, j, k, l) $ 表示将要考虑 $ S $ 从小至大第 $ i $ 位,已经考虑了序列中的 $ j $ 位数,二进制中 $ 1 $ 的个数为 $ k $,上一次给当前的进位为 $ l $。我们枚举从剩下的 $ n - j $ 中选取 $ t $ 个作为下一个数,显然 $ dp(i, j, k, l) $ 会对 $ dp(i + 1, j + t, k + (l + t) \bmod{2}, \lfloor \dfrac{t + p}{2} \rfloor) $ 产生 $ dp(i, j, k, l) \times v_i^t \times {n - j \choose t} $ 的贡献,我们按照这个正向的 dp 式子推一遍即可,显然 $ l $ 的枚举上界时 $ \lfloor \dfrac{j}{2} \rfloor \(,\) t $ 的枚举上界为 $ n - j $,其余的上届很显然,最后找答案的时候,因为我们状态设计 $ i $ 是将要考虑第 $ i $ 位,所以答案第一维应该为 $ m + 1 $,第二维显然 $ n $,第三维枚举一下 $ k $,然后最后一维枚举到 $ \lfloor \dfrac{n}{2} \rfloor $ 即可,判断一下如果 k + __builtin_popcount(l) <= K,那么记录答案即可。

LG-P7962 [NOIP2021] 方差

日期:2022.10.18

算法:差分 DP

难度:IX

题面:给定长度为 $ n $ 的不降数列 $ a_n $,每次可进行的操作为选定 $ i $,使 $ a_i \leftarrow a_{i - 1} + a_{i + 1} - a_i $,输出任意次操作后数列方差最小值乘以 $ n^2 $。定义方差 $ D = \dfrac{1}{n}\sum_{i = 1}^n (a_i - \overline{a})^2 $。

题解:将原式转化为 $ D = n\sum_{i = 1}{n}a_i2 - \left( \sum_{i = 1}^n a_i \right)^2 $。同时手玩数据后可以发现每次的操作的实际意义就是交换差分后的差分数组 $ d_i $ 中的两个值,于是我们发现求解的过程就是取排列差分数组。然后可以发现最优解的差分数组排列应该是单峰的,也就是先单调递减再单调递增的,这个东西也可以严谨证明,可以从修改一个数后上述式子前者后者的变化量的分类讨论来证明,也可以观察样例的最终结果发现这个性质。

然后考虑通过 DP 将 $ \sum a_i^2 $ 和 $ \sum a_i $ 表示一下,于是令 $ dp(i, S) $ 表示考虑前 $ i $ 个差分数组的数,$ \sum a_i = j \(,\) dp $ 数组的值为 $ \sum a_i^2 $。不难发现我们把差分数组排个序,这样每个数都要插到当前的左侧或右侧,我们也就要通过这个设计转移,于是显然有插在右边和左边分别有如下转移:

$ dp(i, S + \sum_{j = 1}^id_j) \leftarrow dp(i - 1, S) + \left(\sum_{j = 1}id_j\right)2 $ 和 $ dp(i, S + i \times d_i) \leftarrow dp(i - 1, S) + i \times d_i^2 + 2 \times S \times d_i $。

因为数列递增,$ S $ 的上界设为 $ a_n \times n $ 即可,对于最终求解,只需要枚举一遍 $ S $,求 $ \min(n \times dp(n - 1, S) - S^2) $ 即可。

LG-P7113 [NOIP2020] 排水系统

日期:2022.10.18

算法:拓扑序 分数类 高精度(int128)

难度:IV

题面:给定一个 DAG,给入度为 $ 0 $ 的点军加入 $ 1 $ 的流量,并均分流入到所有出点上,求所有出度为 $ 0 $ 的点最后又多少流量,输出分数。

题解:在可以使用 __int128_t 的今天,这道题便没有当时那么难了,直接写个分数类,__gcd 暴力通分即可,然后需要注意结果输出也会爆 __int128_t

CF437C The Child and Toy

日期:2022.10.19

算法:性质 贪心

难度:III

题面:给定 $ n $ 个点 $ m $ 条无向边,删除一个点要消耗和这个点直接连接的所有点的权值和,求删除所有点最小的消耗。

题解:考虑把删点变成删边,对于删除每条边,显然其贡献为两个端点中的一个的权值,所以遍历每条边答案加上两个端点中的最小值即可。

CF1076E Vasya and a Tree

日期:2022.10.19

算法:树上差分 前缀和

难度:V

题面:给定 $ n $ 个节点以 $ 1 $ 为根的树,初始所有点权值为 $ 0 \(,\) m $ 次修改每次将 $ u $ 所在子树中距离 $ u $ 不大于 $ d $ 的点权值增加 $ v $,求最后每个点的权值。

题解:考虑把修改离线,记录每个点上的所有修改,然后做一个奇怪的树上差分,搜索的时候考虑把每一个深度记录在当前搜索的子树内对应的差分值,然后每搜到一个点先加上对应的差分值,把它的修改加到答案里,然后在对应的差分的结束的地方减去这个值,当搜完节点所在子树的时候,要搜其它的子树了,这个节点子树的差分桶就不再有效了,所以此时将之前的修改回退一下即可。

JDOJ-2905 mode

日期:2022.10.19

算法:性质

难度:III

题面:给定数列 $ a_n $ 求众数。特别地,这里定义众数为出现次数严格大于 $ \dfrac{n}{2} $ 的数。特别地,空间限制在 1MiB 左右。

题解:因为出现次数大于一半,所以在枚举的时候记录一个 $ cur $ 和 $ cnt $,对于一个新的数,若 $ cur $ 不存在或 $ cnt $ 为 $ 0 $ 直接覆盖 $ cur $,如果与 $ cur $ 相同那么令 $ cnt $ 加 $ 1 $,反之令 $ cnt $ 减 $ 1 $,也就是与一个 $ cur $ 互相抵消,这样最终剩下的 $ cur $ 一定为本题定义的众数。

JDOJ-2429 random num

日期:2022.10.19

算法:性质

难度:III

题面:同 JDOJ-2905。

题解:双倍经验。

LG-P2397 yyy loves Maths VI (mode)

日期:2022.10.19

算法:性质

难度:III

题面:同 JDOJ-2905。

题解:三倍经验。

ABC246A Four Points

日期:2022.10.19

算法:语法

难度:I

题面:给定矩形三个点坐标,求另一个点的坐标。

题解:显然四个点横纵坐标分别两两相等,三个横坐标异或,三个纵坐标异或即可。

ABC246B Get Closer

日期:2022.10.19

算法:语法

难度:I

题面:给定一个向量的坐标表示,求同向模长为 $ 1 $ 的向量坐标。

题解:语法题没营养,为了凑齐一套题去写的。

ABC246C Coupon

日期:2022.10.19

算法:贪心

难度:II

题面:$ n $ 个物品第 $ i $ 个价格为 $ a_i $,有 $ k $ 张 $ x $ 元优惠券,可以叠加,但不能分裂开使用,求全部购买的最少花费。

题解:对于所有 $ a_i \ge x $ 一直使用优惠券直到 $ a_i \lt x $,然后降序排序用剩余的 $ k $ 个券把前 $ k $ 个抵消,后面的求和即为答案。

ABC246D 2-variable Function

日期:2022.10.19

算法:二分 求导

难度:III

题面:存在函数 $ f(a, b) = a^3 + a^2b + ab^2 + b^3 $,要求 $ a, b \ge 0 $,给定 $ n $,求最小的 $ f(a, b) $ 满足 $ f(a, b) \ge n \(。\) n \le 10^{18} $。

题解:显然 $ a, b $ 的范围不超过 $ 10^6 $,则可以枚举 $ a $,二分 $ b $,取最小值即可。

对于二分 $ b $ 的单调性证明,可以考虑固定 $ a $ 为参数,则有函数 $ f(b) = b^3 + ab^2 + a^2b + a^3 $,三次函数不好操作,所以考虑求导,显然 $ f'(b) = 3b^2 + 2ab + a^2 $,因为 $ a, b $ 非负,所以显然导函数 $ f'(b) \ge 0 $,所以范围内函数取值单调递增,于是可以二分。

或者不进行二分,根据单调性,显然 $ a $ 减小时 $ b $ 不会比上次更大,所以写个双指针枚举,$ a $ 升序,$ b $ 降序,小于 $ n $ 时直接 break 即可。

ABC246E Bishop 2

日期:2022.10.20

算法:01BFS

难度:IV

题面:给定有障碍的网格图,. 为空地,# 为障碍。给定起点终点,每次移动仅可以斜向走任意长度,问从起点到终点的最少移动次数,可能无解,无解输出 -1

题解:BFS 较为显然,因为时限 6000ms,只要写的不太丑直接搜也能过。对于本题,使用 01BFS 较为显然。我们在宽搜每次搜一步且距离仅为 $ 1 $,并记录上一步的方向,如果同向则认为走了一个 $ 0 $ 边,异向则为 $ 1 $ 边,开个双端队列,同向插到前面,反之插到后面,按照正常宽搜每次取队头扩展即可。

需要注意对于 01BFS 时,我们判断是否走过和是否为答案的时候,需要在从队头取元素的时候判断,而不是在扩展的时候判断。因为如果在某一次由 $ 1 $ 扩展的时候如果直接把 $ vis $ 设为 $ \texttt{true} $,但是这可能会导致后面从 $ 0 $ 扩展的,本应能插在队列中比这个更前面的更优的无法转移,使答案更劣。同时我们也需要考虑到不同方向的时候扩展也是不同,所以 $ vis $ 中也要考虑到方向这一维。

ABC246F typewriter

日期:2022.10.20

算法:容斥 枚举子集

难度:V

题面:给定 $ n $ 个字符串,字符集为小写字母,可以任意选择一个字符串,作为字符库,然后(可多次选择同一字符)任意组成长度为 $ l $ 的字符串,求一共能形成多少种长度为 $ l $ 的字符串。

题解:容斥较为显然,显然最终答案也就是,用任意一个字符集形成的字符串减去任意两个的加上任意三个...于是我们考虑令全集为 $ S = 2^n - 1 $ 然后对其进行枚举子集,二进制第 $ i $ 位为 $ 1 $ 或 $ 0 $ 代表是否考虑这个数,所以枚举的时候直接 __builtin_popcount() 算一下个数,奇数代表加,反之减。然后对于每一个字符串,因为字符集较小,也用一个 int 的二进制表示是否存在对应的字符,然后把需要的字符串都与起来,设数量为 $ \xi $,则此次运算的字符集大小则为 $ \xi $,所以此次答案为 $ \xi^l $,加减考虑好即可。

ABC246G Game on Tree 3

日期:2022.10.21

算法:树形DP 二分答案

难度:V

题面:类似于 LG-P3554 [POI2013]LUK-Triumphal arch,给定一棵树,有点权,B 初始在 $ 1 $,每轮 A 选择一个点将权值变为 $ 0 $,然后 B 移动一次,B 可在任意时刻停止游戏然后获得所在点上的权值的得分,两人均采取最优策略那么最终 B 最少会拿到多少的得分。

题解:与 POI2013 基本相同,对于本题依然考虑二分答案,对于当前的答案 $ k $,认为大于 $ k $ 的贡献为 $ 1 $,小于等于的为 $ 0 $,于是显然有 dp,令 $ dp(i) $ 表示在 $ i $ 节点上时需要额外多少次的变为 $ 0 $ 的操作,显然有转移 $ dp(i) = \max(\sum_{j \in son(i)} dp(j) - 1, 0) + \left[ v(i) \gt k \right] $,最后判断一下根节点 $ 1 $ 为 $ 0 $ 则合法,反之不合法。

POJ-2352 Stars

日期:2022.10.21

算法:树状数组

难度:III

题面:简单的二维数点,给定 $ y $ 升序的 $ n $ 个坐标,每个点左下角的点的个数为其等级,求每个等级有多少点。

题解:因为 $ y $ 升序所以不用排序了。。权值树状数组,直接按顺序查询 $ x $ 以内的已有点的个数,然后把这个点插进去即可。需要注意坐标可能为 $ 0 $,所以把所有 $ x $ 都加 $ 1 $ 处理。

LG-P2163 [SHOI2007]园丁的烦恼

日期:2022.10.20

算法:树状数组 二维数点 二维前缀和

难度:IV

题面:二维平面存在一些点,每次询问求一个矩形区间内点的个数。

题解:显然对于询问的矩形区间 $ (a, b) \rightarrow (c, d) $,有 $ ans = s(c, d) - s(a - 1, d) - s(c, b - 1) + s(a - 1, b - 1) $。则每次询问求出四个二维前缀和即可,但是直接求即使离散化后 $ O(n^2) $ 依然会寄,于是考虑类似 POJ-2352 的方法,按照 $ x $ 升序排列点和二位前缀和询问,离散化后可以 $ O(n \log n) $ 求出所有的询问,当然这道题不离散化直接 $ O(n \log v) $ 即可。

LG-P8574 「DTOI-2」星之影

日期:2022.10.20

算法:性质 二分

难度:IV

题面:有 $ f(x) = \lfloor \sqrt[4]{x} + \dfrac{1}{2} \rfloor \(,\) T $ 组询问,给定 $ n $,求 $ \sum_{i = 1}^n = \dfrac{1}{f(i)} $。强制在线。

题解:考虑对于 $ f(x) $ 显然取值是一段一段的,且段长递增,于是我们维护一下每一段的初始值,然后做个前缀和,考虑好加 $ 1 $ 减 $ 1 $ 的边界,每次询问 lower_bound $ O(\log n) $ 查询一下即可。题解里也有 $ O(1) $ 查询的方法,大概就是嗯推一下柿子。

CF396C On Changing Tree

日期:2022.10.20

算法:dfs序 树状数组

难度:IV

题面:给定 $ n $ 个点以 $ 1 $ 为根的树,初始所有节点权值为 $ 0 \(,\) q $ 个操作或询问,操作为给定 $ v, x, k $,对 $ v $ 及其子树,记节点与 $ v $ 的距离为 $ dis $,则对每个节点的权值加上 $ x - dis \times k $,询问为给定 $ v $ 输出 $ v $ 的权值。

题解:考虑对于每次修改 $ v, x, k \(,\) v $ 子树(包括 $ v $)下的 $ u $,修改量为 $ x - dis(u, v) \times k $,因为是在树上,所以可以转化成 $ x - (dep_v - dep_u) \times k \(,展开一下:\) x + dep_u \times k - dep_v \times k $,然后发现式子里对于点 $ v \(,\) dep_v $ 是定值,所以开个线段树(或树状数组)维护一下 $ x + dep_u \times k $ 和 $ k $ 即可。然后这样的话每次修改就等于是对一整个子树的修改,考虑如何转到序列上,显然按照 dfs 序即可。

SP1043 GSS1 - Can you answer these queries I

日期:2022.10.22

算法:DDP

难度:VI

题面:对于序列 $ a_n \(,\) q $ 次询问求 $ \left[ l_i, r_i \right] $ 的区间最大子段和。

题解:浅谈 DDP 与 广义矩阵乘法

ABC246Ex 01? Queries

日期:2022.10.22

算法:DDP

难度:VII

题面:给定长度为 $ N $ 的仅包含 01? 的字符串 $ S $,给定 $ Q $ 组询问 $ (x_1, c_1), (x_2, c_2), \cdots, (x_q, c_q) $,每次将原字符串中 $ x_i $ 位置的字符改为 $ c_i $,然后输出 $ S $ 有多少种非空子串,? 需任意替换为 01

题解:ABC246Ex 01? Queries Solution

ABC247A Move Right

日期:2022.10.24

算法:语法

难度:I

题面:给定一个 $ 4 $ 位的二进制串,求其右移一位之后的值的二进制。

题解:语法题没营养。

ABC247B Unique Nicknames

日期:2022.10.24

算法:语法

难度:III

题面:给定 $ n $ 个人的姓和名,定义一个人的昵称为他的姓或名,且一个人的昵称不能与其他人的姓或名重复,判断给定的数据是否能为每个人钦定一个昵称。可行输出 Yes,反之输出 No

题解:开个 map 维护一下每个字符串的出现次数,如果一个人的姓和名出现次数都大于等于 $ 2 $ 那么他的昵称无论选择姓还是名都会重复一定不合法。需要注意特判一下如果一个人的姓名相同那么就是出现次数大于等于 $ 3 $ 才会不合法。

ABC247C 1 2 1 3 1 2 1

日期:2022.10.24

算法:语法

难度:II

题面:我们按如下方式定义序列 $ S_n $:

$ S_1 $ 只包含一个整数 $ 1 $。

$ S_n $ 为 $ S_{n - 1}, n, S_{n - 1} $ 构成的序列。

给定 $ n $,输出序列 $ S_n $。

题解:也算是个语法题吧。。从定义就能看出来这是递归定义的,于是我们也写个递归,$ n = 1 $ 的时候输出 $ 1 $,否则按照要求递归并输出即可。(如果把 $ n $ 开大一点变成求第 $ k $ 位应该能略微增加一点难度)

ABC247D Cylinder

日期:2022.10.24

算法:语法

难度:III

题面:存在一个队列,给定 $ q $ 个操作或询问,按以下格式输入:

1 x c,表示向队尾插入 $ c $ 个 $ x $。

2 c,表示从队头取出 $ c $ 个元素并输出它们的和。

题解:大概也算是个语法题?维护一个队列,里面元素是个 pair < int, int > 记录元素值和数量,$ 1 $ 操作就是队尾插入一个 {x, c},$ 2 $ 操作判断一下,如果队头能取就取出来然后求和,否则对队头做一个类似 ODT 的 Split 的操作,然后对应维护一下 $ ans $ 即可。对于 $ 2 $ 操作详细解释一下,不难想到维护询问剩余的 $ c $,令队头元素的 $ c $ 为 $ c' $,值为 $ x $,显然若 $ c' \le c $,那么直接 $ c \leftarrow c - c' $ 然后答案加上 $ c' \times x $ 后把队头弹出,反之答案加上 $ c \times x $ 并 $ c' \leftarrow c' - c $,注意判断队列非空即可。

ABC247E Max Min

日期:2022.10.24

算法:容斥

难度:IV

题面:给定数列 $ A_n $,给定 $ X, Y $,我们定义数对 $ (L, R) $ 满足 $ 1 \le L \le R \le n $,且数列 $ A_L, A_{L + 1}, \cdots, A_R $ 满足最大值为 $ X $,最小值为 $ Y $,求有多少种满足条件的数对。

题解:关于本题有一些较为显然的 $ O(n \log ^2 n) $ 或 $ O(n \log n) $ 或 $ O(n) $ 的做法,前两个大概对应着树套树和线段树,然后后者大概是维护前一个等于 $ X $ 等于 $ Y $,在 $ (X, Y) $ 之间的啊等等一堆东西然后跑一遍,这里就不多赘述了,网上相关做法很多。这里主要提供一个机房巨佬 @Zpair 想出来的人类智慧容斥的做法与推导。

首先我们考虑这段区间里一定不能包含在 $ (-\infty, Y) \cup (X, +\infty) $ 内的数,所以我们考虑让所有在这个区间内的数作为分割点,这样最终会让我们的序列被分成很多个子序列,这里我们不难发现,合法的区间一定不会有跨越两个子区间的,一定都是在子区间内的子子区间。

所以这时候我们只需要对于每个划分出来的子区间考虑其中的合法区间即可,不难想到我们要找的区间合法当且仅当里面包含了至少一个 $ X $ 和至少一个 $ Y $,为了方便记录这里我们令等于 $ X $ 的点为 $ 1 $,等于 $ Y $ 的点为 $ -1 $,在 $ (X, Y) $ 之间的点为 $ 0 $,也就是我们要找的就是每个子区间里包含 $ -1 $ 和 $ 1 $ 的区间由多少个。这里我们令包含 $ 1 $ 的区间的集合为 $ A $,包含 $ -1 $ 的为 $ B $,令子区间内的所有区间的集合为 $ \Omega $,不难想到我们比较好求的是,不包含 $ 1 $ 和 $ -1 $ 的区间,不包含 $ 1 $ 的区间,不包含 $ -1 $ 的区间,以及全集,分别对应着 $ \overline{A} \cap \overline{B} \(,\) \overline{A} \(,\) \overline{B} \(,\) \Omega $。我们的目标是求出 $ A \cap B \(,所以我们希望通过前面的四个求出答案,不难想到如下推导:\) A \cap B = \Omega - \overline{A} - \overline{B} + \overline{A} \cap \overline{B} $。

此时考虑如何维护这四个值,显然我们可以考虑把子区间再次进行分割,遍历三次,分别由 $ 1 $ 分割,由 $ -1 $ 分割,由 $ -1 $ 或 $ 1 $ 分割,也就分别对应着式子中的三个区间的大小,然后对于每个子区间维护一遍即可,最后就是一个大常数的线性求解。

然后还有个点就是如果 $ X = Y $ 的话那么其实际上是既是 $ 1 $ 又是 $ -1 $,需要特判一下。

ABC247F Cards

日期:2022.10.24

算法:人类智慧 DP

难度:VI

题面:给定 $ n $ 张卡片,每张卡片正反面各有一个数,给定每张卡片正面和反面的数,保证正面的数构成的序列,和反面的数构成的,分别均为 $ 1 $ 到 $ n $ 的排列,可以选择任意张卡片并获得其正反面的数,要求最终所有获得的数至少包含 $ 1 $ 到 $ n $ 每个数至少一次。求有多少种取法,对 $ 998244353 $ 取模。

题解:考虑卡片之间的联系,显然若一个数在同一张卡牌的正反面那么这张卡牌必须选择,否则无法凑齐一个排列,反之这个数一定会在两张卡牌中出现,且这两张卡牌一定至少有一张被选择,否则依然无法凑齐一个排列,这个很好理解。

于是我们考虑一些对于这种题的一般的套路,可以尝试建图,对于本题不难想到,我们将一张卡牌作为一个点,将这个点向卡牌上存在的数的另一次出现所在的卡牌连一条边。抽象地说,对于一个数所在的两张(或一张)卡牌位置 $ pos_{i, 0} $ 和 $ pos_{i, 1} $,其中一定有一个刚好为 $ i $,我们就是要从 $ i $ 向不等于 $ i $ 的那个 $ pos_i $ 连一条边,这里便不难想到从 $ i $ 向 $ pos_{i, 0} \oplus pos_{i, 1} \oplus i $ 连边即可。

不难想到这样会形成多个环,每一个环代表着其中几张卡牌,同时这些卡牌上的数在环内一定每个数都出现了两遍,如排列 $ { 1, 2, 3 } $ 和排列 $ { 2, 1, 3 } $,显然 $ i = 1 $ 时向数字 $ 1 $ 所在的另一张卡牌 $ 2 $ 和数字 $ 2 $ 所在的另一张卡牌 $ 2 $ 连边(不拿发现很有可能存在重边与自环,所以需要注意判重并忽略),对于 $ i = 2 $ 同理,最终一定会形成 $ 1 \rightarrow 2 \rightarrow 1 $ 和 $ 3 \rightarrow 3 $ 两个环,第一个环可以求出带有 $ 1, 2 $ 数字的卡牌的让 $ 1, 2 $ 都至少存在一次的卡牌选择方案数,第二个环则为 $ 3 $ 的方案数,将两者乘起来即为最终答案。并且环上每个边相连的两个点,或者说两张卡牌,至少要被选择一张,因为一条边连结的两个卡牌一定存在着相同的数,为了保证构成排列至少需要选择一个。

同时发现不同环的方案数,只跟环的长度有关,于是我们考虑令 $ dp(i) $ 表示 $ i $ 个数构成的环,则有边界 $ dp(1) = 1 $ 和 $ dp(2) = 3 $,和转移 $ dp(i) = dp(i - 1) + dp(i - 2) $,大概就是我们考虑向原环中插入第 $ i $ 个数,如果选择第 $ i $ 个数,那么任意的前 $ i - 1 $ 个数的合法方案都可以接上新的这个数,反之如果不选第 $ i $ 个,那么第 $ i $ 个的两侧都应该是选择的,这个时候我们直观地可以想到,固定其左右的两个然后由 $ dp(i - 3) $ 转移而来,但是这个是有遗漏的。观察发现对于 $ i $ 不选择的,是存在类似 $ \cdots \rightarrow 0 \rightarrow 1 \rightarrow i(0) \rightarrow 1 \rightarrow 0 \rightarrow \cdots $,也就是在固定三个之后左右各自接一个不选的,这个东西显然是不在 $ dp(i - 3) $ 里的,因为两个都不选接在一起形成环是不合法的,考虑如何正确地转移:我们可以考虑在 $ dp(i - 2) $ 的方案中找到任意一个选择的点,然后在其旁边接上 $ i $ 和另一个固定的选择的点,这样也是合法的且不重不漏,最终就是 $ dp(i) = dp(i - 1) + dp(i - 2) $。

于是考虑并查集维护好每个环的大小,$ \prod dp(siz_i) $ 即为最终的答案。

ARC081C Don't Be a Subsequence

日期:2022.10.25

算法:DP

难度:V

题面:给定字符串 $ S $,求不是其子序列的最短串,若有多个输出字典序最小的。

题解:记 $ S_{i, \vert S \vert} $ 表示字符串 $ S $ 的 $ [i, \vert S \vert] $ 的后缀子串,令 $ nxt(i, c) $ 表示 $ S_{i, \vert S \vert} $ 中满足 $ S_i = c $ 的最小 $ i \(。\) dp(i) $ 表示 $ S_{i, \vert S \vert} $ 的答案的长度,考虑倒序转移,不难想到 $ dp(i) = \min_{c = 'a'}^{'z'} { dp(nxt(i, c) + 1) + 1 } $,然后找答案的时候找转移的时候取得那个最小值,输出整个转移的过程即可。

LG-P1247 取火柴游戏

日期:2022.10.25

算法:Nim

难度:IV

题面:给定 $ k $ 和 $ k $ 个整数表示石子堆石子数,每次可以可以从任意一堆取走任意根火柴,不能跨堆或不取,取走最后一个的人获胜,若你先手求是否必输,若非必输第一次怎么取必胜,取后状态是什么。

题解:Nim 游戏模板,异或和为 $ 0 $ 则必输,否则找到 $ a_i \oplus sum \lt a_i $,然后把这一位变成 $ a_i \oplus sum $ 即可。

LG-P7913 [CSP-S 2021] 廊桥分配

日期:2022.10.25

算法:性质

难度:IV

题面:有 $ n $ 个廊桥,$ m_1 $ 个国内航班,$ m_2 $ 个国外航班,廊桥的使用遵循先到先得,且国内外航班独立,没有廊桥可用的就会停到远机位,把 $ n $ 个廊桥分配给国内和国外,令可以有廊桥的飞机尽可能多。

题解:考虑到如果廊桥增多,原来在廊桥中的飞机还会在廊桥中,所以我们可以先不考虑具体的分配,认为廊桥全部分配给国内或国外进行预处理。开两个堆记录当前空闲的廊桥编号和正在使用的廊桥的结束使用的时间,每架新的飞机到之前判断一下是否有已经空闲了的,如果有就重新将其插回编号堆,然后如果编号堆非空就优先选择编号更小的廊桥停进去,记录每个廊桥停过了多少个,预处理后做一遍前缀和,然后枚举分配,取最大值即可。

注意读入的飞机抵达时间不一定升序,所以需要先对输入排序。

LG-P1880 [NOI1995] 石子合并

日期:2022.10.25

算法:区间DP

难度:IV

题面:有 $ n $ 堆石子环形排列,每次可以合并两堆相邻的石子堆并将新堆的石子数作为本次合并的得分,求最小得分和最大得分。

题解:区间DP 显然,令 $ dp(l, r) $ 表示合并 $ [l, r] $ 区间最大的得分,显然边界为 $ dp(i, i) = 0 $,转移为 $ dp(l, r) = \max/\min(dp(l, r), dp(l, k) + dp(k + 1, r) + sum(r) - sum(l - 1) ) $,注意石子排列为环形,所以考虑把序列复制一份,枚举每一个 $ dp(i, i + N - 1) $ 在其中取 $ \min/\max $ 即可。

LG-P3146 [USACO16OPEN]248 G

日期:2022.10.25

算法:区间DP

难度:IV

题面:给定 $ 1 \times n $ 的地图,每次可以合并相邻的且相同的两个数,合并后数 $ +1 $,如 $ 2 $ 和 $ 2 $ 合并后为 $ 3 $,求最大可以合成多大的数。

题解:标准区间DP,令 $ dp(l, r) $ 表示完全合并这段区间后形成的数,不能合成可以设为 $ -1 $,显然边界 $ dp(i, i) = a_i $,转移为 $ dp(l, r) = \max(dp(l, r), f(k)) $,其中若 $ dp(l, k) = dp(k + 1, r) $ 则 $ f(x) = dp(l, k) + 1 $ 反之 $ f(x) = -1 $。但是因为我们设置的状态的限制,最终我们需要在所有可能的区间中的值里取 $ \max $ 作为答案。

LG-P1063 [NOIP2006 提高组] 能量项链

日期:2022.10.26

算法:区间DP

难度:IV

题面:给定环形排列的能量珠,有头和尾的值,前者的尾等于后者的头,每次可以合成相邻两个,假设头尾分别为 $ (m, n), (n, p) $,新的珠子为 $ (m, p) $ 并获得 $ m \times n \times p $ 的贡献,求最大贡献。

题解:和石子合并没什么区别,相同思路跑一遍即可。

LG-P1005 [NOIP2007 提高组] 矩阵取数游戏

日期:2022.10.26

算法:区间DP

难度:V

题面:给定 $ n \times m $ 矩阵,每次取数从每行各取一个元素,共取 $ n $ 个,$ m $ 次取完,每次只能取行首或行尾,每次取的得分为 $ v \times 2^i \(,\) i $ 表示第 $ i $ 次取数,$ v $ 表示被取数的值,求最大得分。

题解:对于每一行分别考虑,每一行的答案求和即为最终答案。对于每一行,令 $ dp(l, r) $ 表示将区间这些数取完后最大得分,边界 $ dp(i, i) = v_i \times 2^m $,注意当剩一个数的时候一定是最后一次取,所以需要乘一个 $ 2^m $,转移为 $ dp(l, r) = \max(dp(l + 1, r) + v_l \times 2^{m - len + 1}, dp(l, r - 1) + v_r \times 2^{m - len + 1}) $,注意需要使用 __int128_t

LG-P4170 [CQOI2007]涂色

日期:2022.10.26

算法:区间DP

难度:V

题面:一段连续木板初始无色,每次可以选择一段区间染色并覆盖以前的颜色,给定目标颜色求最少染色次数。

题解:显然区间DP,边界 $ dp(i, i) = 1 $,对于 $ dp(l, r) $,若 $ s_l = s_r $,那么显然可以认为一定可以存在一次直接从 $ l $ 到 $ r $ 的染色,所以从 $ \min(dp(l + 1, r), dp(l, r - 1)) $ 转移即可。反之那么一定可以存在一次染色从 $ l $ 染到 $ k $,并让剩下的 $ k + 1 $ 到 $ r $ 完成染色,最终的转移就变为枚举 $ k \(,\) dp(l, r) = \min{ dp(l, k) + dp(k + 1, r) } $。

LG-P2466 [SDOI2008] Sue 的小球

日期:2022.10.26

算法:区间DP

难度:VI

题面:直角坐标系上有 $ n $ 个彩蛋,每个彩蛋有坐标和速度 $ v $,每秒彩蛋会向下掉 $ v $ 的距离,可以掉到负半轴,你从 $ x_0 $ 出发,每秒走 $ 1 $ 的距离,到达彩蛋的横坐标时就会获得其当前时刻纵坐标的贡献,必须取走所有彩蛋,求最大得分。

题解:发现取彩蛋 $ i $ 时获得的贡献为 $ y_i - t \times v_i $,而我们转移时的 $ t $ 是不确定的,所以我们要考虑在转移时维护 $ t $,或者说 $ t $ 造成的贡献。不难想到可以先假设所有彩蛋都被选了,也就是把先认为其为 $ \sum y_i $,通过 区间DP 转移很显然,于是对于从 $ [l, r] $ 转移消耗了 $ t $ 的时间时,可能的贡献会减少 $ (sum(l - 1) + sum(n) - sum(r - 1)) \times t $,考虑维护 $ t $,显然我们可以在维护已经取完 $ [l, r] $ 的同时维护最终停在了 $ l $ 还是 $ r $ 上,同时注意对于边界的设置,我们不难想到可以将所有点按 $ x $ 坐标排序,然后同时初始点也需要加在排序里,这样我们将方程中所有值都赋为 $ -\infty $,仅原点所在位置设为 $ 0 $,以此转移后最终答案即为 $ \max(dpl(1, n + 1), dpr(1, n + 1)) $。

P1220 关路灯

日期:2022.10.26

算法:区间DP

难度:VI

题面:类似 LG-P2466 [SDOI2008] Sue 的小球,差异是本题保证 $ x $ 升序,$ y $ 均为 $ 0 $。

题解:LG-P2466 [SDOI2008] Sue 的小球 没用的输入删一下,转移式子都不用变,最后输出 $ -\max $ 即可。

LG-P1108 低价购买

日期:2022.10.26

算法:DP

难度:IV

题面:求最长下降子序列和其方案数。

题解:前者略,后者考虑做 $ O(n^2) $ 的 DP,记录 $ cnt(i) $ 为以 $ i $ 结尾长度为 $ dp(i) $ 的最长下降子序列方案书,显然枚举 $ j \lt i $,若 $ dp(i) = dp(j) \land a(i) = a(j) $ 那么两种方案重复,令 $ cnt(j) = 0 $,若 $ dp(i) = dp(j + 1) \land a(i) \lt a(j) $ 那么 $ cnt(i) \leftarrow cnt(i) + cnt(j) $,若 $ dp(i) = 1 $ 那么 $ cnt(i) = 1 $,最后跑一遍把所有 $ dp(i) = mx $ 的 $ cnt(i) $ 加一起即为第二问答案。

JDOJ-1945 求最长不下降序列

日期:2022.10.26

算法:DP

难度:IV

题面:求最长不下降子序列具体方案。

题解:在一般的 $ O(n \log n) $ 的基础上,从 $ dp(i) $ 最大的位置往前找,每找到一个 $ dp(i) + 1 $ 等于当前值的就记录这个值并把当前值变为 $ dp(i) $,这样最终一定能获得一个方案。

LG-P1091 [NOIP2004 提高组] 合唱队形

日期:2022.10.26

算法:DP

难度:III

题面:求使一个序列的单调性变成单峰,最小需要移除多少个数。

题解:正着逆着分别求一边最长上升子序列,然后枚举峰值的位置取 $ \min $ 即可。

LG-P1095 [NOIP2007 普及组] 守望者的逃离

日期:2022.10.26

算法:贪心

难度:III

题面:给定时间 $ t $,每秒可以选择跑步 $ 17m/s $ 或消耗 $ 10\texttt{mp} $ 进行闪现 $ 60m/s $,给定距离 $ m $,求如果能跑出去最快在第几秒,跑不出去最远能跑到哪。

题解:显然宏观来看回蓝后使用闪现更优,不难想到在前面一定是无脑闪现更优,在最后的部分可能需要跑一段更优。考虑双线程,记录只跑步和只用闪现在规定秒数能到的距离,若闪现快于跑步将跑步的距离换成闪现的距离一定合法,以此判断即可。

LG-P1541 [NOIP2010 提高组] 乌龟棋

日期:2022.10.26

算法:DP

难度:IV

时间复杂度:$ O(siz^4) $,其中 $ siz $ 为每种卡片最多的数量。

题面:给定 $ n $ 个格子的棋盘,$ m $ 张卡片写着 $ 1, 2, 3, 4 $ 中的一个表示能走对应的长度,每个格子有对应分数,求最大分数。

题解:可以从卡片数量入手,令 $ dp(i, j, k, s) $ 表示用对应张的对应卡片能获得的最大分数,显然转移的时候会加上 $ val(1 \times i + 2 \times j + 3 \times k + 4 \times s + 1) $,注意这个 $ +1 $ 是因为初始的时候在 $ 1 $ 位置。

LG-P1868 饥饿的奶牛

日期:2022.10.27

算法:DP

难度:IV

时间复杂度:$ O(n) $。

题面:给定 $ n $ 个区间,求在不交的前提下可以选择的最长的区间长度和。

题解:给值域内每个点开一个 vector 记录右端点为该点的左端点和区间长度,不难想到 $ dp(i) = \max(dp(i - 1), dp(lft(i) - 1) + siz(i)) $,可以进行离散化,最终为 $ O(n) $。

LG-P2679 [NOIP2015 提高组] 子串

日期:2022.10.27

算法:DP

难度:IV

时间复杂度:$ O(nmk) $。

题面:给定长度为 $ n $ 和 $ m $ 的两个字符串,要求选出 $ k $ 个前者的不交的子串,按序拼接后形成后者,求方案数。

题解:令 $ dp(i, j, k, 0/1) $ 表示考虑前 $ i $ 位字符串 $ A $,已经匹配完了前 $ j $ 位字符串 $ B $,已经选完了 $ k $ 个子串,第 $ i $ 位是否被选,所能形成的方案数。不难想到边界 $ dp(i, 0, 0, 0) = 1 $,转移 $ dp(i, j, k, 0) = dp(i - 1, j, k, 0) + dp(i - 1, j, k, 1) $ 和 $ dp(i, j, k, 1) = [A_i = B_j](dp(i - 1, j - 1, k - 1, 0) + dp(i - 1, j - 1, k - 1, 1) + dp(i - 1, j - 1, k, 1)) $。

LG-P2501 [HAOI2006]数字序列

日期:2022.10.27

算法:DP

难度:VII

时间复杂度:约 $ O(n^2) $,但因数据随机,实际上为 $ O(\texttt{能过}) $。

题面:给定长度为 $ n $ 的数列 $ a_n $,目标为将其变成严格单调递增的序列,求最少需要改变多少个数,以及在改变最少的数的情况下每个数改变量绝对值之和的最小值。

题解:首先考虑第一问,正难则反,需要改变多少数不好维护,于是考虑维护有多少数不需要改变,我们考虑当我们想要保留 $ a_i $ 和 $ a_j $,只改变中间的数使其合法时,必须要满足 $ j - i + 1 \ge a_j - a_i + 1 $,化简一下就是 $ a_i - i \ge a_j - j $,于是我们考虑令 $ dif_i = a_i - i $,不难想到序列 $ dif_n $ 的最长不下降子序列便为可以保留的最多的数,用所有的数减去这个即可。

考虑第二问,对于一个可能的合法最长不下降子序列中的相邻的两个值 $ dif_l $ 和 $ dif_r $,不难想到在 $ (l, r) $ 之间的所有 $ dif $ 都一定不在 $ [dif_l, dif_r] $ 之间,否则就会形成更长的最长不下降子序列,所以我们需要将这区间内的所有数并到区间内,存在贪心,找到一个分界点 $ sp $,在 $ [l, sp] $ 的 $ dif $ 全部变为 $ dif_l \(,\) [sp + 1, r] $ 变为 $ dif_r $,我们记录每一种长度的最长不下降子序列的末尾值的可能,转移较为显然,对于 $ dp(i) $,从 $ 1 $ 到 $ n $,每次枚举的时候重新处理一个前缀和和后缀和记录 $ \sum \operatorname{abs}(dif_i - dif_{pre}) $ 和 $ \sum \operatorname{abs}(dif_i - dif_{til}) $ 以便于快速处理。注意哨兵节点以及 $ dif(0) = -\infty $ 和以长度为 $ 0 $ 的桶里加入一个 $ 0 $。

LG-P8590 『JROI-8』这是新历的朝阳,也是旧历的残阳

日期:2022.10.28

算法:性质

难度:IV

时间复杂度:$ O(n + k) $。

题面:给定不降序列 $ a_n $,对于 $ \forall m \le k $,将序列分为可空的 $ m $ 段,对于第 $ i $ 段的数加 $ i $,对于每一个 $ m $ 令 $ q_m $ 为增加后的 $ \sum_{j = 1}na_j2 $,使 $ q_m $ 最大,给定 $ k $,求最大的 $ \sum q_m $。

题解:显然对于一个数最优的要么为 $ +1 $ 要么为 $ +m $,并且由于序列的单调性一定存在一个分界点 $ sp $,让前面的数均 $ +1 $ 后面的数均 $ +m $ 为最优,且当 $ m $ 增加时显然 $ sp $ 单调递减,于是枚举 $ m $,延续之前的 $ sp $ 找新的,显然第一个不满足 $ (a_{sp} + 1)^2 \le (a_{sp} + m)^2 $ 的即为分界点,于是此时答案为 $ \sum_{i = 1}^{sp}(a_i + 1)^2 + \sum_{i = sp + 1}^{n}(a_i + m)^2 \(,化简一下,\) a_i $ 前缀和为 $ sum_i \(,\) a_i^2 $ 前缀和为 $ sumsq_i $,则为 $ sumsq_n + 2 \times sum_{sp} + sp + 2 \times m \times (sum_n - sum_{sp}) + (n - sp) \times m^2 $。然后需要注意如果比较为 $ \le $ 那么 $ m = 1 $ 的时候会让 $ sp $ 直接变为 $ 0 $,所以选择 $ \lt $。

LG-P3336 [ZJOI2013]话旧

日期:2022.10.31

算法:DP

难度:IX

时间复杂度:$ O(k) $。

题面:存在定义在 $ [0, n] $ 的连续函数 $ f(x) \(,\) n $ 为整数满足 $ f(0) = f(n) = 0 \(,所有极值点均在整数取到,\) f(x) $ 极小值均为 $ 0 $,对于每一段区间 $ (I, I + 1) $ 中 $ f(x) $ 均为斜率为 $ 1 $ 或 $ -1 $ 的一次函数,求有多少个函数满足条件,和满足条件的函数中 $ f(x) $ 最大化的最大值。

题解:设状态 $ dp(i, 0/1) $ 表示考虑到第 $ i $ 个存在的点,第 $ i $ 个点之前是上升的或下降的,然后一大堆特判讨论,细节考虑一下即可。

LG-P8817 [CSP-S 2022] 假期计划(民间数据)

日期:2022.10.31

算法:性质

难度:V

时间复杂度:$ O(nm) $。

题面:给定 $ n $ 个点 $ m $ 条边的无向图,有点权,给定 $ k $,对于距离在 $ [0, k + 1] $ 之间的点认为是可以直接到达的,从 $ 1 $ 出发,经过四个不同节点后再回到 $ 1 $,经过的四个节点的点权和为答案,需要最大化答案。

题解:宽搜维护任意两点之间的 $ dis $,然后从 $ 1 $ 扩展一次后再扩展一次,枚举所有点,距离不大于 $ k + 1 $ 的即为可以到达,第二次扩展时维护其前驱的最优值次优值次次优值,最后枚举判断一下即可。

LG-P8818 [CSP-S 2022] 策略游戏(民间数据)

日期:2022.11.01

算法:线段树猫树

难度:IV

时间复杂度:$ O(n \log n + m \log m + q) $。

题面:给定序列 $ A $ 和 $ B $,每次询问给定 $ l_1, r_1, l_2, r_2 $,先手在 $ [A_{l_1}, A_{r_1}] $ 之间选一个数,后手在 $ [B_{l_2}, B_{r_2}] $ 选择一个数,得分为 $ A_i \times B_j $,前者最大化得分,后者最小化得分,求按最优策略 $ q $ 次询问每轮得分。

题解:发现没有修改因此用猫树维护这两个序列,维护其区间最大最小正数,最大最小负数,是否含零,然后每次询问枚举一下写一大堆特判即可,细节巨多,但是不太需要脑子。

LG-P8819 [CSP-S 2022] 星战(民间数据)

日期:2022.11.01

算法:哈希 人类智慧

难度:V

时间复杂度:$ O(n + m + q) $。

题面:给定 $ n $ 个点 $ m $ 条边的有向图,定义每个点只有一条出边且从一个点出发可以进入一个环路的时候为合法的,每次操作可能会删除或恢复某条边,或删除恢复一个点的所有入边,每次操作后询问图是否合法。

题解:不难发现若每个点都只有一条出边那么一定可以形成一个或多个环路,所以只需要判断是否所有点都有一个出边,同时发现可以转化为维护只有一个入边,于是考虑给每个点分配一个随机值,一个点的入点的随机值和为其权值,再维护每个点初始权值当前权值和所有点权值和,这样就可以 $ O(1) $ 修改 $ O(1) $ 查询等。

LG-P3387 【模板】缩点

日期:2022.11.02

算法:Tarjan缩点 拓扑排序

难度:IV

时间复杂度:$ O(n + m) $。

题面:有点权的有向图求最大权值和简单路径。

题解:Tarjan SCC 缩点之后重新建图拓扑排序后跑 DAG 上的 DP 即可,因为 Tarjan SCC 之后已经是反拓扑序,所以不进行拓扑排序也行。

LG-P3388 【模板】割点(割顶)

日期:2022.11.02

算法:Tarjan求割点

难度:IV

时间复杂度:$ O(n + m) $。

题面:求割点模板。

题解:和缩点差的不多,简单改一下就过了。

LG-P3806 【模板】点分治1

日期:2022.11.04

算法:点分治

难度:VII

时间复杂度:$ O(nm\log n) $。

题面:给定一棵 $ n $ 节点树,$ m $ 次询问求树上是否存在两点之间距离为 $ k $。

题解:标准点分治,注意要把答案存下来在点分的过程中进行统一计算,而不是每次询问重建点分树。

LG-P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目

日期:2022.11.15

算法:数学

难度:IV

时间复杂度:$ O(1) $。

题面:给定两个数,求最大的由任意数量的这两个数不能组成的数。

题解:按照和 $ a $ 取模分段,不难发现每多一个 $ b $,每段 $ a $ 里就会被多覆盖一个,去掉 $ 0 $,显然全部覆盖满的是 $ (a - 1) \times b $,然后找到最大的没被覆盖的,也就是少一段 $ a $,变成 $ (a - 1) \times b - a $。

LG-P6280 [USACO20OPEN]Exercise G

日期:2022.11.16

算法:DP

难度:V

时间复杂度:$ O(n^2) $。

题面:对于序列 $ a_n $ 每次将第 $ i $ 个数变成第 $ a_i $ 个,显然 $ k $ 步后会变回原序列。求长度为 $ n $ 的所有序列中的 $ k $ 之和。

题解:不难发现对于每个序列都有很多环,答案为所有环的 $ lcm $,也就是每个环长分解质因数后所有质因数幂次最大值组成的数。考虑令 $ dp(i, j) $ 表示考虑前 $ i $ 个质数,组成的环长为 $ j $ 的 $ \sum k $,有转移 $ dp(i, j) = \sum_{p, c} dp(i - 1, j - p^c) \times p^c $。最终答案为 $ \sum_i dp(cnt_{prime}, i) $。

LG-P4161 [SCOI2009]游戏

日期:2022.11.16

算法:DP

难度:V

时间复杂度:$ O(n^2) $。

题面:双倍经验,改为求不同的 $ k $ 的数量。

题解:方程最后不乘 $ p^c $ 即可。

LG-P6279 [USACO20OPEN]Favorite Colors G

日期:2022.11.16

算法:图论建模 人类智慧 启发式合并

难度:V

时间复杂度:$ O(n \log n) $。

题面:共 $ n $ 个点,存在 $ m $ 个点对,如果两个前者的点对应着同一个后者的点,那么这两个点颜色相同,最大化不同的颜色数,求字典序最小方案。

题解:建图后存一下边,然后发现如果有多个入边的时候所有入点可以合一起,一直找入边不少于两个的然后合一下所有入点,弄好一大坨细节即可。。

LG-P6283 [USACO20OPEN] The Moo Particle S

日期:2022.11.16

算法:性质

难度:IV

时间复杂度:$ O(n \log n) $。

题面:坐标系存在 $ n $ 个点,两个点之间若存在偏序关系,即 $ x_i \lt x_j, y_i \lt y_j $,则可以任意消除其中一个点,求最少可以剩下几个点未被消除。

题解:按 $ x $ 排序一维,对 $ y $ 求前缀最小值和后缀最大值,跑一边,若第 $ i $ 的前缀最小值仍然大于第 $ i + 1 $ 的后缀最大值,那么显然这两段之间无法互相消除,那么答案 $ +1 $ 即可,注意初始答案为 $ 1 $。

LG-P6147 [USACO20FEB] Delegation G

日期:2022.11.16

算法:性质 人类智慧

难度:IV

时间复杂度:$ O(n \operatorname{d}(n)) $。

题面:对于 $ k \in [1, n - 1] $ 输出是否能将原树分成 $ k $ 条链。

题解:不难想到只有 $ k \mid n - 1 $ 才有可能可行,所以考虑对每个 $ n - 1 $ 的因数进行验证,这步是 $ O(\operatorname{d}(n)) $ 的。显然对于一个子树里,会有一些链在子树内被选完,在有解的情况下还有可能从子树伸出一条链挂在祖宗节点上,所以考虑根据这个深搜,开个 set 进行相互抵消以及剩余多少无法抵消的操作。

LG-P6142 [USACO20FEB]Delegation P

日期:2022.11.17

算法:性质 人类智慧

难度:V

时间复杂度:$ O(n \log n) $。

题面:与上一题类似,本题求将原树分成长度至少 $ k $ 长度的多条链,最大化的 $ k $。

题解:二分一下答案然后和上一题类似,细节改一改即可。

LG-P6278 [USACO20OPEN]Haircut G

日期:2022.11.17

算法:BIT

难度:IV

时间复杂度:$ O(n \log n) $。

题面:给定序列 $ a_n $,对于 $ j \in [0, n - 1] $ 求将序列所有大于 $ j $ 的数全部变成 $ j $ 后逆序对的数量。

题解:显然对于 $ i $ 和其之前的数构成的逆序数量对会对 $ j \in [a_i, n - 1] $ 贡献,写个 BIT 找逆序对然后差分搞一下即可。

P6149 [USACO20FEB] Triangles S

日期:2022.11.17

算法:人类智慧

难度:V

时间复杂度:$ O(n \log n) $。

题面:给定 $ n $ 个点,求其可能组成的三角形面积和。

题解:发现枚举点无法通过,考虑枚举每个三角形的直角,将四个方向的三角形分别考虑,排序后对于一个新的点分别考虑与其 $ x, y $ 相同的点的数量和上一个的位置,每一维维护一个类似前缀和的东西快速计算,即可 $ O(n) $ 求解。

LG-P2986 [USACO10MAR] Great Cow Gathering G

日期:2022.11.17

算法:换根DP

难度:IV

时间复杂度:$ O(n) $。

题面:给定 $ n $ 的树,有点权边权,距离根路径乘点权为点贡献,最小化贡献。

题解:记录一下每个点及其子树点权和无脑换根即可。

LG-P2303 [SDOI2012] Longge 的问题

日期:2022.11.17

算法:数学

难度:IV

时间复杂度:$ O(\sqrt{n} \log n) $。

题面:求 $ \sum_{i = 1}^n \gcd(i, n) $。

题解:LG-P4270 的双倍经验。

LG-P8846 『JROI-7』PMK 配匹串符字

日期:2022.11.12

算法:构造

难度:III

时间复杂度:$ O(n) $。

题面:对于一个字符串 \(S\),记 \(|S|\) 表示 \(S\) 的长度,记 \(S_{l,r}\) 表示 \(S_l,S_{l+1},...,S_r\) 组成的字符串。对于一个字符串 \(S\) 和一个正整数 \(i\le |S|\),若 \(k\) 是满足 \(k<i\)\(S_{1,k}=S_{i-k+1,i}\) 的最大的正整数,则 \(next_i=k\)。特别的,若不存在 \(k\) 满足条件,则 \(next_i=0\)。构造一个由小写字母组成的字符串 \(S\),满足 \(|S|=n\),且对于所有正整数 \(i\le |S|\)\(next_i\) 之和最小。

题解:一个 $ a $ 后剩下全是 $ b $ 即可。

LG-P8847 [JRKSJ R5] 1-1 A

日期:2022.11.12

算法:构造

难度:III

时间复杂度:$ O(n) $。

题面:给定序列 \(a\)\(\forall i\in [1,n],a_i\in \{1,-1\}\)。可以将序列任意重排,需最小化重排后序列的最大子段和。

题解:显然使 $ 1 $ 和 $ -1 $ 交替排列即可,并且需要尽量使 $ -1 $ 不靠边。

LG-P8849 『JROI-7』hibernal

日期:2022.11.12

算法:构造

难度:V

时间复杂度:$ O(T n \log n) $。

题面:交互题 $ n $ 个苹果里有两个金苹果,每次询问可以将苹果分为两个集合,返回两个集合中金苹果数量的乘积,最多询问 $ 19 $ 次。

题解:考虑先将其按照二进制分组,对于每一位上为 $ 1 $ 的分成一组,最后可以取得两个苹果位置下标的异或和,然后可以根据异或和将数分为两组,在两组里分别二分查询,查到的位置及其对应的位置即为答案。

LG-P1136 迎接仪式

日期:2022.11.18

算法:DP

难度:V

时间复杂度:$ O(nk^2) $。

题面:存在仅包含 jz 的字符串,可以最多 $ k $ 次每次交换任意位置的两个字符,最大化最终串里 jz 子串的数量,求最大值。

题解:考虑 DP,令 $ dp(i, j, k, 0/1) $ 表示前 $ i $ 个数,改变了 $ j $ 个 j,$ k $ 个 z,最后一位是 jz,然后转移一下即可。。

51nod-2014 小朋友的笑话

日期:2022.11.18

算法:ODT

难度:V

时间复杂度:$ O(n \log n) $。

题面:给定 $ n $ 个小朋友,$ m $ 次操作每次要么询问 $ [l, r] $ 之间有多少小朋友在笑,要么对 $ [x - l, x + l] $ 所有小朋友讲 $ l $ 的笑话,如果其以前听过则不继续笑,没听过则开始笑。

题解:两只 ODT,一只维护颜色状态,一只维护小朋友状态,随便写写就过了。

LG-P5350 序列

日期:2022.11.18

算法:ODT

难度:VI

时间复杂度:$ O(\texttt{玄学}) $。

题面:给定序列实现包含区间推平,增加,复制,交换,翻转,求和等操作。

题解:ODT 无脑实现即可。

LG-P5500 [LnOI2019]真正的OIer从不女装

日期:2022.11.19

算法:性质 线段树

难度:VII

时间复杂度:$ O((n + q) \log n) $。

题面:给定序列 $ a_n \(,\) q $ 次操作每次区间推平,或求区间内进行 $ k $ 次以内的反转操作后最长的所有数均相同的子串,特别地,反转操作为对于任意一个区间内的点 $ p $,反转 $ [l, p] $ 和 $ (p, r] $。

题解:显然一次反转和多次反转等效,即对应题目。同时亦等效为将查询区间的某个前缀拼在其最后,所以线段树维护区间最长相同子串,左端点的子串,右端点的子串,左右端点颜色,区间长度等,支持区间修改区间查询和初始化,然后询问的时候判一下 $ k $ 是不是 $ 0 $ 即可,随便写写就过了,很好写很好调。

CF1051D Bicolorings

日期:2022.11.21

算法:DP

难度:IV

时间复杂度:$ O(nk) $。

题面:给定一个 $ 2 \times n $ 的棋盘,可以对上面的格子黑白染色,求染色后棋盘上的联通块的个数正好为 $ k $ 的染色方案数。

题解:令 $ dp(i, j, 0/1, 0/1) $ 表示考虑前 $ i $ 列形成 $ j $ 个连通块,第 $ i $ 列的上下状态分别为 $ 0/1 $ 的方案数,像 ABC248 一样转移一下即可,水题。

LG-P3901 数列找不同

日期:2022.11.22

算法:线段树 性质

难度:IV

时间复杂度:$ O(n \log n) $。

题面:给定序列区间查询区间内是否所有数字各不相同。$ n, q \le 5 \times 10^5 $。

题解:记录每个点的值上一次出现的位置,挂到线段树上,区间查询最大值,如果最大值小于 $ l $ 一定合法,反之不合法。

Exam-2022_11_22-T2

日期:2022.11.22

算法:DP 树状数组

难度:IV

时间复杂度:$ O(n \log n k) $。

题面:给定序列 $ a_n $,求其中长度为 $ k $ 的上升子序列个数。

题解:$ O(n^2k) $ 的 DP 十分显然,用树状数组优化一下转移即可。

Exam-2022_11_22-T4

日期:2022.11.22

算法:DP

难度:IV

时间复杂度:$ O(nk) $。

题面:对树染色,要求相邻两点颜色不同,每个节点有一个序列表示可能被染的颜色,颜色共有 $ k $ 种,求合法染色方案数。

题解:树形 DP,设 $ dp(i, j) $ 表示染完 $ i $ 子树,其根节点颜色为 $ j $ 的合法方案数,转移很显然,加上所有颜色和减去不合法的然后把所有子树乘起来即可。

LG-P8848 [JRKSJ R5] 1-1 B

日期:2022.11.22

算法:组合数 DP

难度:IV

时间复杂度:$ O(n^2) $。

题面:与 P8847 类似,本题求最小化最大子段和后的方案数。

题解:如果 $ cnt_{-1} \ge cnt_1 $,那么显然问题转化为在 $ cnt_{-1} + 1 $ 个空位里插板,答案即为 $ cnt{-1} + 1 \choose cnt_1 $。

反之则问题转化为 DP,不难想到此时的最大子段和一定为 $ \sum a_i $,于是考虑令 $ dp(i, j) $ 表示共有 $ i $ 个数,最大子段和(即整个序列和)为 $ j $ 的方案数,转移即为 $ dp(i, j) = dp(i - 1, j - 1) + dp(i - 1, j + 1) $,滚动数组一下即可。

LG-P8858 折线

日期:2022.11.19

算法:线段树分治 性质

难度:V

时间复杂度:$ O(T n \log n) $。

题面:从从 $ (0, 0) $ 到 $ (10^{100}, 10^{100}) $ 的矩形里有正偶数 $ n $ 个整点,需构造一条从 $ (0, 0) $ 到 $ (10^{100}, 10^{100}) $ 的折线,要求其每部分都平行于坐标轴,不能经过给定的整点,需要将整块区域分为包含给定整点数量相等的两块,要最小化其整点。输出合法的折线的整点数,保证一定存在如下直线。

题解:LG-P8858 折线 Solution

首先我们可以考虑观察一下样例和大样例,不难发现所有答案均在 $ [2, 4] $ 之间,以此可猜想答案一定在此区间中,可以尝试感性证明一下:

首先一个折点的话一定无法将矩形分为两块,所以不合法。

两个折点的话即为通过一条直线将矩形分为两半,这条直线可以水平也可以竖直,所以对于这种情况,我们只需要对 $ x $ 坐标和 $ y $ 坐标分别做一个前缀和,然后分别遍历一遍,如果存在一个点 $ i $ 使 $ sum_i = \dfrac{n}{2} $ 那么显然合法,答案为 $ 2 $。

三个折点的话随便画一下就会发现,最终的情况一定是隔离起来一个左上角或者右下角,如图:

考虑如何维护,显然可以把这个东西按照类似二位偏序或者说二维数点来写,先按照 $ x $ 排序,然后把每一段相同的 $ x $ 的所有 $ y $ 都插到权值线段树里,然后在线段树上二分查找是否存在一个前缀刚好等于 $ \dfrac{n}{2} $。然后再把整个顺序反过来插反过来查,找是否存在一个后缀恰好等于 $ \dfrac{n}{2} $,如果能找到那么显然可以通过隔离出来一段左上角或右下角的角落构造合法折线,答案即为 $ 3 $。

如果以上的判断都不合法的话那么显然最终答案即为 $ 4 $,这个通过我们最开始 “面向数据编程” 得到的性质直接得到,也可以考虑画一下,如图:

显然这个时候我们是可以隔离出来任意数量的整点了,比较好理解,考虑一下如果想更多地包含新的点,将中间那块凸起略移动一下 $ x $ 和 $ y $ 即可,感性理解一下即可。

LG-P7527 [USACO21OPEN] United Cows of Farmer John G

日期:2022.11.22

算法:性质 双指针 树状数组

难度:IV

时间复杂度:$ O(n \log n) $。

题面:给定序列,求其合法子串数量,定义合法子串为序列除了左右端点之外的数都与左右端点不同。

题解:首先可以考虑维护 $ l_i, r_i $ 分别表示以 $ i $ 作为合法字串的右端点和左端点时能够选择的最远的左端点和右端点,开个桶维护一下上次出现的位置即可。然后经典套路,考虑对于一个固定的左端点 $ a $,显然有右端点 $ b \in [a, r_a] $,且需满足 $ l_b \le a $。前者条件实际就是个区间询问,我们可以考虑用树状数组维护这东西,考虑如何维护后者条件,开个 BIT 初始所有均为 $ 1 $。可以再开个桶 $ i $ 记录所有 $ l_x = i $ 的 $ x $。倒序枚举 $ a $,然后每次移动 $ a $ 把 $ a + 1 $ 的桶的所有值在 BIT 上变为 $ 0 $,如此每次区间求和即可。注意最终需要把答案减 $ n $ 以排除形如 $ [a, a] $ 的区间。

LG-P1494 [国家集训队] 小 Z 的袜子

日期:2022.11.23

算法:莫队

难度:IV

时间复杂度:$ O(n \sqrt{n}) $。

题面:给定序列,$ q $ 次询问求区间 $ [l, r] $ 之间任选两个数相同的概率。

题解:考虑莫队,每个值维护一个桶,然后维护一下总数,选出来颜色相同的对数和不同的对数等,随便写一下即可。

LG-P1903 [国家集训队] 数颜色 / 维护队列

日期:2022.11.23

算法:带修莫队

难度:V

时间复杂度:$ O(n^{\frac{5}{3}}) $。

题面:给行序列,$ q $ 次操作包含单点修改和区间查询不同值的数量。

题解:带修莫队,额外维护一个当前修改了的数量。

LG-P3375 【模板】KMP字符串匹配

日期:2022.11.23

算法:KMP

难度:IV

时间复杂度:$ O(n + m) $。

题面:求单字符串匹配和模式串所有前缀的 border。

题解:KMP 模板。

CF713C Sonya and Problem Wihtout a Legend

日期:2022.11.24

算法:DP

难度:IV

时间复杂度:$ O(n^2) $。

题面:给定序列,每次操作可以将某个元素 $ +1 $ 或 $ -1 $,求将序列改成单调递增的最小操作次数。

题解:DP 显然,首先需要给第 $ i $ 个数 $ -i $,这样既可转化为求单调不降,则有性质任意数最后一定是原来的数里的某一个。所以设 $ i $ 个数最后一个数为 $ j $,方程为 $ dp(i, j) = \min_{k = 1}^{j} dp(i - 1, k) + \operatorname{abs}(a_i - j) $,类似前缀和的优化一下即可 $ O(n^3) \longrightarrow O(n^2) $。然后因为刚才的性质,值域大的时候我们直接排个序做个映射跑一下即可。

CF13C Sequence

日期:2022.11.24

算法:DP

难度:IV

时间复杂度:$ O(n^2) $。

题面:给定序列,每次操作可以将某个元素 $ +1 $ 或 $ -1 $,求将序列改成单调不降的最小操作次数。

题解:CF713C Sonya and Problem Wihtout a Legend 的弱化版,双倍经验。

LG-P2893 [USACO08FEB] Making the Grade G

日期:2022.11.24

算法:DP

难度:IV

时间复杂度:$ O(n^2) $。

题面:给定序列,每次操作可以将某个元素 $ +1 $ 或 $ -1 $,求将序列改成单调不降或单调不升的最小操作次数。

题解:结论是一样的,没有区别,和 CF713C Sonya and Problem Wihtout a Legend 一样,三倍经验。

LG-P4597 序列 sequence

日期:2022.11.24

算法:性质

难度:VI

时间复杂度:$ O(n \log n) $。

题面:给定序列,每次操作可以将某个元素 $ +1 $ 或 $ -1 $,求将序列改成单调不降的最小操作次数。加强版,数据范围 $ O(n^2) $ 过不了。

题解:一些妙妙推导。。然后总之最后结论就是搞个大根堆,每个新的数先插进去,然后当前数和堆顶比较一下,小于的话贡献为 $ top - val $ 然后弹一下堆顶,再插一遍当前数,最后即为总贡献。

LG-P4345 [SHOI2015]超能粒子炮·改

日期:2022.12.02

算法:推式子

难度:VI

时间复杂度:$ O(p^2 \log p + T \log^2 n) $。

题面:求 $ \sum_{i = 0}^k {n \choose i} \bmod p $。

题解:ABC251Ex Solution 中的一步相同。

VIJOS-P1033 整数分解(版本2)

日期:2022.12.03

算法:性质

难度:IV

时间复杂度:$ O(n \cdot \log ans) $。

题面:将 $ n $ 分解成若干个数,最大化这些数乘积。

题解:最终结论就是尽量全部分解为 $ 3 $,然后不能剩下 $ 1 $,如果有 $ 1 $ 就消耗 $ 3 $ 再变成 $ 2 $。具体的证明很复杂,可以参考 算法——整数分解,所以建议打表找规律。需要高精度

CF545E Paths and Trees

日期:2022.12.03

算法:最短路生成树

难度:IV

时间复杂度:$ O(n \log n) $。

题面:求最短路生成树中边权和最小的。

题解:最短路生成树模板的基础上,在最短路松弛的时候同时判断一下等于的时候若边权更小就更新边即可。

AcWing 349 黑暗城堡

日期:2022.12.03

算法:最短路生成树

难度:IV

时间复杂度:$ O(n \log n) $。

题面:求最短路生成树方案数。

题解:和上一题类似,松弛的时候记录一下个数,最后把个数乘起来即可。

[CF1005F Berland and the Shortest Paths](Berland and the Shortest Paths)

日期:2022.12.03

算法:最短路生成树

难度:IV

时间复杂度:$ O(n + mk) $。

题面:求最短路生成树并输出其中的任意 $ k $ 个方案。

题解:最短路生成树模板的基础上,每个节点开一个 basic_string 记录一下由哪些边松弛,然后深搜一下同时维护选择哪些边,搜到足够方案数之后直接 exit(0) 即可,水题。注意无边权,故 Dijkstra 改成 bfs 之后可以去掉一只 $ \log $,但是没必要。

CF1076D Edge Deletion

日期:2022.12.03

算法:最短路生成树

难度:IV

时间复杂度:$ O(n \log n) $。

题面:要求在图里保留至多 $ k $ 条边后使满足最短路生成树性质的点最多,输出方案。

题解:依然是最短路生成树,不难想到构建出最短路生成树之后,在保证和 $ 1 $ 连通的基础上保留最短路生成树上的边即可,一定最优,证明显然。具体地,从 $ 1 $ 开始深搜或宽搜最短路生成树,过程中输出 $ \min(k, n - 1) $ 条边即可。

LG-P2505 [HAOI2012]道路

日期:2022.12.04

算法:最短路生成树 拓朴排序

难度:V

时间复杂度:$ O(n (n \log n + m)) $。

题面:给定 $ n $ 点 $ m $ 条边的有向图,求对于其每条边在多少条最短路径中。

题解:类似最短路生成树。首先两个性质,最短路中的一段子路径一定也是最短路,且当以某个点为原点建立最短路图(即保留所有满足最短路生成树性质的边)一定为 DAG,于是不难想到枚举每个点然后建图后跑拓朴排序。建图可以先跑一边 Dijkstra 然后枚举每条边,如果存在 $ dis_s + val = dis_t $ 那么这条边一定在最短路图中。对于枚举其中每条边在多少条路径中,可以考虑先拓朴排序处理原点到该点有多少条不同路径,记为 $ cntup_i $,然后反向拓朴排序枚举每个点之后能连出来多少条,记为 $ cntdown_i $,处理完后枚举每条边,对于 $ s \rightarrow t $ 的边,贡献即为 $ cntup_s \times cntdown_t $。

LG-P8865 [NOIP2022] 种花

日期:2022.11.28

算法:前缀和

难度:IV

时间复杂度:$ O(n^2) $。

题面:大概就是在有障碍的网格图里分别问能填充多少 CF 形状的图形。严谨地叙述太复杂了,这里就不多叙述,直接去看 洛谷题面 吧。

题解:做完之后翻了一下讨论区,似乎还有一些高妙的悬线法之类的解法,可以很简短地切掉这题。不过我不会我感觉不是很好像,所以这里提供一个思维难度极低,代码略长的做法,比较无脑,但是是妥妥的 $ O(n^2) $。

大概就是手画一下找性质,然后发现,对于 C 型来说,当我们固定其上下两行之后,若最左侧列从上至下都是 $ 0 $,那么这样的方案书就是上端横行向右最大延申的 $ 0 $ 乘上下端延伸的。换句话说,我们就是要枚举确定每个 C 的左侧的竖直的部分,然后把上下两侧可以延伸的乘起来加到方案里。

然后这东西是 $ O(n^3) $ 的,也就是枚举每个点然后再枚举竖直能延申多少。

然后我们发现这东西实际上是可以优化的,也就是说当我们确定一个竖直部分上端点所在行为 $ i $ 的时候,如果这个点竖直向下最长可以延申 $ \xi $,那么我们要的就是行数为 $ [i + 2, i + \xi] $ 之间的所有可能水平延伸的长度之和。

这样的话我们就随便做一个竖直方向上的前缀和即可优化 $ O(n^3) \longrightarrow O(n^2) $,则对于 C 型的就过了。

对于维护最长能延申的距离,随便写一个 deque 即可,也就是双端队列,里面存下标,对于每个值如果为 $ 0 $ 那么直接插进去,如果为 $ 1 $ 那么更新队列里所有的下标的值即可,具体可看代码,很好理解。

然后考虑 F 型,这个需要想一下,发现对于一个确定的 C 型,变成 F 型就是乘上其下端点能够延伸的距离。这个正常做还是 $ O(n^3) $ 的,优化方式也类似,类比之前的方式,维护水平延申长度的时候直接乘上竖直延申长度,然后再做个前缀和即可,具体实现可以参考代码。

Tips:有一些循环能压在一起,会让代码可读性变差这里就不压了。然后因为是 VP 也没打对拍,交上去最后两个点 WA 了,随便写了个满的数据才发现是最后加法没有取模。。。不过这种错误随便拍一下就能调出来,然后这题本身也很好调,思路非常直观,一步一步检查即可。

LG-P8867 [NOIP2022] 建造军营

日期:2022.11.29

算法:边双缩点 DP

难度:VI

时间复杂度:$ O(n + m) $。

题面:给定连通图,需要选定至少一个关键点,然后保护至少一条边,被保护的边不会被破坏,需要保证无论破坏哪条边都不会影响关键点之间的连通性。求方案数。

题解:这题我感觉还是有点难度的,主要是细节很多,如果不是我写的太麻烦了的话,感觉评个紫应该比较合理(不过似乎洛谷上西西弗的题难度评级都偏低一些

首先这个题意读完应该就能想到 Tarjan 边双缩点吧,这个还是很显然的。如果在同一个边双里,那么无论删去这里面的任意哪条边都不会使方案不合法,所以可以直接进行 e-BCC 缩点,这样对于每一个 e-BCC 里,如果设其中的边数为 $ \xi $,点数为 $ \epsilon $,那么只考虑这个 e-BCC 的话,如果不在其中设置关键点(军营)其方案数就是 $ 2^{\xi} $,设置的话就是 $ 2^\xi \times (2^\epsilon - 1) $。

然后同时不难发现因为图本身是连通的,所以进行 e-BCC 缩点之后原图就会变成一棵树,所以此时这个东西就很显然变成了一个 树形DP。或者说就是变成了 $ 12 - 14 $ 的部分分,如果想通了树形 DP,再缩个点之后就直接可以切了。

考虑 DP,不难想到一个很显然的状态,设 $ dp(p, 0/1) $ 表示考虑到点 $ p $ 所在子树,且其子树中是否设置关键点(军营)的合法方案数,且此时必须满足 $ p $ 子树的所有关键节点都和 $ p $ 连通,这个继续讨论下去就会发现如果不这样设定就无法转移了。

考虑转移,对于任意一个 $ p $ 的子节点 $ son $,首先显然有:

\[dp(p, 0) \longleftarrow dp(p, 0) \times dp(son, 0) \times 2 \]

然后考虑 $ dp(p, 1) $ 的转移:

  1. 如果从 $ dp(son, 0) $ 转移,那么这条边(桥)就是可保护也可不保护,且 $ p $ 点必须设为关键点。

\[dp(p, 1) \longleftarrow dp(p, 1) \times dp(son, 0) \times 2 \]

  1. 如果从 $ dp(son, 1) $ 转移,那么则需要考虑,对于 $ p $ 为关键点的,则桥必须被保护。

\[dp(p, 1) \longleftarrow dp(p, 1) \times dp(son, 1) \]

  1. 同2,对于 $ p $ 不为关键点的,显然要从前面所有子树转移后的 $ dp(p, 0) $ 转移而来,且此时这个桥也必须被保护,因为我们要保证子树的关键节点和 $ p $ 连通。

\[dp(p, 1) \longleftarrow dp(p, 1) + dp(p, 0) \times dp(son, 1) \]

同时注意对于这里的转移 $ dp(p, 0/1) $,我们用到的都是上一次的 $ dp(p, 0/1) $,这个东西可以直接类似滚动数组思想写一下,也就是先转移 $ dp(p, 1) $ 然后 $ dp(p, 0) $。

于是我们就发现,这东西假了。。

因为我们漏下了一些情况,再回头考虑我们设置的时候为必须满足 $ p $ 子节点的关键节点都和 $ p $ 连通,但是如果不连通,且除 $ p $ 子树之外的所有节点都非关键节点,那么此时我们这几条从 $ p $ 子树中关键节点到 $ p $ 的边无论是否保护都是合法的,但是我们却忽略了,所以此时要考虑维护一下这个东西。

这个东西我们可以考虑将状态改为 $ dp(p, 0/1/2) $,分别表示考虑 $ p $ 所在子树,子树内没有关键点,或有关键点且要求子树外没有关键点,或有关键点且不要求子树外没有关键点。当然这个东西写起来要多考虑一些东西,所以我们也可以换个思路,直接尝试去补上漏下的。

我们实际上可以在 e-BCC 缩点之后再跑一遍 dfs,维护一下对应子树中的包括被缩掉的所有边的数量,设其为 $ s_p $,(或者给 树形DP 加个返回值记录一下好像也行,不过细节会更多)不失一般性,设根为 $ 1 $,那么当我们维护完 $ dp(p, 1) $ 的时候,我们算漏的方案数似乎就是:$ dp(p, 1) \times 2^{s_1 - s_p} $,也就是子树内设置关键点,子树外不设置关键点,则子树外的所有边都是任意的。然后你会发现这个东西又假了。。

考虑发现如果 $ p \longleftrightarrow fa $ 的边被连上了,那么这个东西已经被 $ dp(fa, 1) $ 给计算过了,这样会重,所以我们钦定 $ p \longleftrightarrow fa $ 的边不选择,即可做到不重不漏,这样最终此处的贡献就是 $ dp(p, 1) \times 2^{s_1 - s_p - 1} $。

然后注意对于根节点时,其不存在我们刚才说的漏下的那些方案,但需要加上一般的答案,也就是 $ dp(1, 1) $。

至此,这道细节巨多的题就做完了。

LG-P8866 [NOIP2022] 喵了个喵

日期:2022.12.01

算法:性质

难度:VI

时间复杂度:$ O(nS) $。

题面:存在 $ n $ 个栈,给定 $ m $ 张卡牌,每张卡牌有图案 $ a_i $,给定 $ k $,有 $ a_i \in [1, k] $。保证每种图案的卡牌数均为偶数。初始所有栈为空。

你可以进行两种操作:

  • 将剩余卡牌中最先的一张插入某个栈,如果此时该栈最上方两张卡牌的图案相同则会被消除。
  • 选定两个非空栈,如果这两个栈底卡牌图案相同则这两张卡牌会被消除。

输入保证有解,求一个合法操作方案。

题解:这道题实际上是可以通过每个部分分来慢慢推出方案的。

首先第一档部分分,对于 $ k = 2n - 2 $,不难想到,我们将一个栈空出来作为备用栈,并保证其它栈里永远最多只有两个卡牌,也就是一个在栈顶一个在栈底,实现上可以把所有可以放卡牌的栈顶和栈底存下来并动态维护,注意要先用栈底再插栈顶。然后顺序遍历所有卡牌。如果当前所有栈中不存在这个颜色,那么找个栈内卡牌数不足 $ 2 $ 的丢进去。如果存在的话,考虑如果其在栈顶,那就把这个卡牌放在对应的栈顶来消除,然后重新将这个位置置为可以放置卡牌。如果在栈底那么将这张卡牌放在备用栈里,然后用操作二将这一对删除即可。

然后考虑后面的 $ k = 2n - 1 $ 的部分分。我们还是按照刚才的思路,保留一个备用栈,然后老样子处理卡牌。显然处理一段时间之后就会出现一个状态,即已经有 $ 2n - 2 $ 个颜色的卡牌被放到了栈里,然后此时又多了个新的栈中不存在的颜色的卡牌。

这时不难想到有如下方案:我们先将这张卡牌搁置,令其颜色为 $ a $,然后继续向后遍历,如果再碰到了颜色为 $ a $ 的直接结束,这里还要注意如果循环结束之后 $ a $ 的两个位置的答案没有被更新,那么需要额外更新一下,即把两个 $ a $ 都塞进备用栈里消除一下。然后考虑过程中碰到的其它颜色的卡牌,显然第一次遇到的时候其一定是在前面的栈中存在的,因为颜色一共就有 $ 2n - 1 $ 个。如果碰到在栈顶的颜色,那么直接将其消除,并且标记这个该颜色的位置为这个位置,如果本次遍历过程中再次碰到这个颜色还要再次把这个颜色放到这个位置上。如果碰到在栈底的颜色,那么这时候考虑当前其对应的栈顶是否已经在本次遍历过程中被删除。我们令这个栈底颜色为 $ b $,栈顶颜色为 $ c $。

如果 $ c $ 被删除的话,那么我们将 $ a $ 放在备用栈里,然后将新的 $ b $ 放到原来的 $ b $ 栈,将其消除,则此时备用栈的位置会多一个栈顶的空位,$ b $ 栈会变空,则我们这时直接将 $ b $ 栈作为新的备用栈即可让状态又变成原来的样子。

如果 $ c $ 依然存在,那么先将 $ a $ 放在 $ b $ 栈里,然后再将新的 $ b $ 放到备用栈里,这样可以将 $ b $ 栈和备用栈栈底的卡牌对应消除掉,此时则 $ b $ 栈又变回两个元素,备用栈又为空。

然后这个时候我们可能会发现一点问题,比如如果有一个实际的结果:$ (2, 1, 3, 1, 1, 1, 1) $(这里记左侧为栈底,右侧为栈顶),但是按照我们的写法实际是变成了 $ (2, 1, 1, 1, 1, 1, 3) $,表面上这些是不同的,但是结果上其都为 $ (2, 1, 3) $。对于剩下的 $ 1 $ 为奇数个的,写一下会发现也是等效的。

思路看起来还是比较简单容易想的,但是这东西实现起来就能感受到恶心了,这里为了方便理解,大概说明一下代码中的部分关键变量名的作用。

对于每个 pair 前者表示栈的索引,后者为栈顶或栈底,$ 1 $ 表示栈底,$ 0 $ 表示栈顶,ans 存的是答案,mp 指的是某个颜色对应的在栈中的位置,stk 存储的是对应位置中存的是什么颜色,mark 是指对应颜色被固定的位置(在遇到 $ a $ 之后遍历的时候使用),unfix 存储的是所有空着的可以使用的栈的位置。

写在后面

这个应该算是我写过最恶心的题之一了,调代码已经人调麻了。如果是在考场上我绝对部分分一拿就跑路。最开始有个思路然后写了一百多行写完了,调试的过程中发现假掉了。。。然后是参考的 @sssmzy 的思路,上面说的也是这个做法,然后做完就开始阴间调试的过程。最后本地对拍全过然后交上去就 WA,各种找样例各种手动模拟,不知道调了多久才找到问题:备用栈切换的时候 unfix 中可能有剩余的新栈中的空位,需要删除。

然后改来改去的代码可能变得很难看,敬请谅解,并且我的实现也可能不够精细,或许会有更简便的方法和更简便的实现,这里只是提供一个思路。还有个问题就是这个 erase 理论上最坏可能是 $ O(n) $ 的,理论上似乎最坏情况下 $ O(S) $ 次,$ O(nS) $ 似乎理论上能被卡,但是这也是理论上,实际上完全卡不满,基本上是无法被卡掉的,并且本身 $ O(nS) $ 也超的不多,再加上 O2 那基本上就是稳稳过。

CF865D Buy Low Sell High

日期:2022.12.20

算法:反悔贪心

难度:IV

时间复杂度:$ O(n \log n) $。

题面:给定序列 $ P_n $ 表示 $ n $ 天里的股价,每天可以买入或卖出一股,本金无限,求最多能多少钱。

题解:明显反悔贪心。

不失一般性,令 $ a \lt b \lt c $,则若某天存在如下决策,即买 $ a $ 卖 $ b $,那么赚的钱为 $ b - a $,而显然对于 $ a $ 来说,若买 $ a $ 卖 $ c $,那么贡献为 $ c - a \gt b - a $,差为 $ c - b $,则不难想到当买 $ a $ 卖 $ b $ 的时候再将 $ b $ 插入,此时如果存在 $ c $ 取了插入的 $ b $,其实际意义即为撤销买 $ a $ 卖 $ b $ 并改为买 $ a $ 卖 $ c $,但此时 $ b $ 天就无操作了,所以我们此时需要再额外插入一个 $ b $,表示后面若需要可以执行一次买 $ b $ 卖 $ d $ 的操作。不难想到可以用小根堆维护,假设堆顶元素为 $ top $,当前元素为 $ x $,若 $ x - top > 0 $ 那么贡献为 $ x - top $,反之将 $ x $ 压入小根堆即可。

CF1253F Cheap Robot

日期:2022.12.21

算法:最短路 最小生成树

难度:V

时间复杂度:$ O(n \log n + m \log m) $。

题面:给定一张 $ n $ 个点 $ m $ 条边的无向连通简单图。每条边存在 $ a_i, b_i, c_i $,表示 $ a_i \rightarrow b_i $ 或 $ b_i \rightarrow a_i $ 耗时 $ c_i $。给定 $ k $,定义 $ n $ 个点中只有前 $ k $ 个点有房子,$ q $ 次询问,每次给定 $ x, y, t $,求从 $ x $ 到 $ y $ 连续的不在房子中的时间是否一定会超过 $ t $,超过输出 No,反之输出 Yes。保证询问中 $ t $ 满足升序。

此为 ABC250Ex 题面,本题求的是最小的 $ t $。

题解:考虑维护对于走每条边时需要多长时间才能连通最近的两个房子,换句话说,满足这个时间的时候这条边就一定可以被走。具体维护可以考虑建一个超级源点并向所有房子连个边,然后跑个 Dijk 即可,当然直接往队列里把所有房子点都塞进去也行。然后我们可以令 $ c_i \leftarrow c_i + dis_{a_i} + dis_{b_i} $ 即可,然后显然可以用并查集维护。

具体地,每次询问将边集里所有新的 $ c_i $ 满足 $ c_i \le t $ 的边加上,用并查集维护,然后查询一下 $ x, y $ 是否连通即可,这个复杂度是 $ O(mq) $ 的,当然发现 $ t $ 符合升序,所以给边排个序跑一边即可,最终复杂度应该是卡在排序和 Dijk 上,也就是 $ O(n \log n + m \log m) $。

同时不难想到即使 $ t $ 不符合升序也可以离线排个序再跑,复杂度多个 $ O(q \log q) $ 而已。至此本题已经结束,下面是一道加强版的双倍经验。

存在一道双倍经验 CF1253F Cheap Robot,略有区别,这里简单说一下:这道题的区别就在于询问的是最小的 $ t $,这样的话实际上是不太好用刚才的思路离线下来维护的,有一个复杂度不太正确但能过的思路,就是将每个询问的 $ a, b $ 分别挂在两个点上,然后将 $ c_i $ 排序,从小到大依次加边,同时更新所有挂在连通块根上的答案,再对应的把询问合上去。但是这个的并查集一定需要按秩合并,否则如果 clear() 之后 shrink_to_fit() 就会 TLE,否则会 MLE,按秩合并会保证合并询问的时候不会复制太多次以保证空间。这个东西的复杂度理论上似乎可以被卡到 $ O(mq) $,但是本题没卡。当然还有一个我口糊的剪枝,就是挂在点上的询问我们用链表维护,然后贪心地取第一次更新这个点时的答案,显然不劣,于是更新后 $ O(1) $ 删除即可,但是这个东西理论上也能被卡到 $ O(mq) $,不过需要精细设计数据。当然正确的做法最后应该是建出最小生成树然后树剖或者倍增之类的实现。

LG-P3390 【模板】矩阵快速幂

日期:2022.12.22

算法:矩阵快速幂

难度:III

时间复杂度:$ O(\log n) $。

题面:矩阵快速幂。

题解:矩阵快速幂。

LG-P3369 【模板】普通平衡树

日期:2023.01.10

算法:Splay

难度:V

时间复杂度:$ O(n \log n) $。

题面:普通平衡树。

题解:Splay 实现。

LG-P3369 【模板】普通平衡树

日期:2023.01.10

算法:FHQTreap

难度:V

时间复杂度:$ O(n \log n) $。

题面:普通平衡树。

题解:FHQTreap 实现。

P3391 【模板】文艺平衡树

日期:2023.01.10

算法:FHQTreap

难度:VI

时间复杂度:$ O(n \log n) $。

题面:平衡树维护序列区间反转及最终单次查询。

题解:FHQTreap 维护区间实现。

P3835 【模板】可持久化平衡树

日期:2023.01.11

算法:FHQTreap

难度:VI

时间复杂度:$ O(n \log n) $。

题面:可持久化普通平衡树。

题解:可持久化FHQTreap 实现。

LG-P5055 【模板】可持久化文艺平衡树

日期:2023.01.12

算法:FHQTreap

难度:VI

时间复杂度:$ O(n \log n) $。

题面:可持久化平衡树维护区间反转增删值区间和。

题解:可持久化FHQTreap 维护区间实现。

LG-P8932 [JRKSJ R7] Clock Paradox

日期:2023.01.07

算法:性质

难度:IV

时间复杂度:$ O(n) $。

题面:给你一个字符串 \(S\),设 \(S=\overline{s_1s_2\dots s_n}\)

有一个字符串 \(T\),初始时 \(T=S\),你可以进行若干次操作,每次操作可以选取 \(S\) 一个子串并插入到 \(T\) 的任意位置。

你希望经过若干次操作后,\(T=\overline{s_1s_1s_2s_2\dots s_ns_n}\),定义 \(f(S)\) 为满足此条件所需的最少的操作次数。

此外,字符串 \(S\) 还会发生一些改变。具体地,有 \(q\) 次修改操作,每次修改操作会给出 \(p\)\(\texttt{c}\),表示令 \(s_p\gets \texttt{c}\)\(\texttt{c}\) 表示任意一个小写字母,而并非 ASCII 为 \(99\) 的字符。

你需要在最开始和每次修改后求出 \(f(S)\) 的值。

题解:连续两个字符不一样就会有贡献,多写几个 if 判断一下即可。

LG-P8933 [JRKSJ R7] 技巧性的块速递推

日期:2023.01.07

算法:找规律 性质

难度:V

时间复杂度:$ O(8^2 \times 32) $。

题面:一个 \(n\times m\) 的棋盘,对每个格子染上黑白两色之一。

询问有多少种染色方式,使得不存在横、竖、斜连续四个格子中存在至少三个相同颜色的格子,并且不存在横、竖、斜连续三个格子的颜色相同。

若设棋盘的左上角为 \((1,1)\),右下角为 \((n,m)\),则称 \(\{(x,y),(x+1,y),(x+2,y)\}\) 为横的连续三个格子,\(\{(x,y),(x,y+1),(x,y+2)\}\) 为竖的连续三个格子、\(\{(x,y),(x+1,y+1),(x+2,y+2)\}\)\(\{(x,y),(x+1,y-1),(x+2,y-2)\}\) 为斜的连续三个格子(以上格子均在棋盘内)。

连续四个格子同理。

题解:不难想到只需要确定 $ 3 \times 3 $ 的格子就可以推导至无限大,又不难想到一定每 $ 8 \times 8 $ 是一个循环块,又已知 $ 3 \times 3 $ 的合法方案共 $ 32 $ 个,所以爆搜一下强行模拟并验证即可。注意细节。

LG-P5586 [P5350] 序列 (加强版)

日期:2023.01.13

算法:FHQTreap

难度:VIII

时间复杂度:$ O(n \log n) $。

题面:给定序列维护区间和,区间推平,区间加,区间复制,区间交换,区间翻转,强制在线。

题解:可持久化FHQTreap 维护,及其阴间,细节巨多,巨难调,思路比较简单,实现难度十分离谱。

LG-P2142 高精度减法

日期:2023.01.23

算法:高精度

难度:III

时间复杂度:$ O(n) $。

题面:高精度减法模板。

题解:高精度减法模板。

LG-P1303 A*B Problem

日期:2023.01.26

算法:高精度

难度:III

时间复杂度:$ O(n^2) $。

题面:高精度乘法模板。

题解:高精度乘法模板。

LG-P1480 A/B Problem

日期:2023.01.26

算法:高精度

难度:III

时间复杂度:$ O(n) $。

题面:高精度除法模板。

题解:高精度除法模板。

LG-P3808 【模板】AC 自动机(简单版)

日期:2023.01.28

算法:AC自动机

难度:IV

时间复杂度:$ O(s + t) $。

题面:AC自动机模板,无需求出现次数。

题解:AC自动机模板。

LG-P3796 【模板】AC 自动机(加强版)

日期:2023.01.28

算法:AC自动机

难度:IV

时间复杂度:$ O(st) $。

题面:AC自动机模板,需要求出现次数,无需优化。

题解:AC自动机模板。

LG-P5357 【模板】AC 自动机(二次加强版)

日期:2023.01.28

算法:AC自动机

难度:V

时间复杂度:$ O(s + t) $。

题面:AC自动机模板,需要求出现次数,需要复杂度线性。

题解:AC自动机模板。同时需要拓朴排序优化,即考虑对于每个更新不去更新到头,而是做标记,并在最后用拓朴排序的思想上传标记。

LG-P3007 [USACO11JAN] The Continental Cowngress G

日期:2023.01.30

算法:2-SAT

难度:IV

时间复杂度:$ O(n^2) $。

题面:2-SAT 模板。

题解:朴素 2-SAT 解决。

LG-P4171 [JSOI2010] 满汉全席

日期:2023.01.30

算法:2-SAT

难度:IV

时间复杂度:$ O(n^2) $。

题面:2-SAT 模板。

题解:朴素 2-SAT 解决。

LG-P3209 [HNOI2010] 平面图判定

日期:2023.01.30

算法:2-SAT

难度:V

时间复杂度:$ O(Tn^2) $。

题面:验证存在给定哈密尔顿回路的图是否为平面图。

题解:首先由于平面图性质可知 $ m \le 3n - 6 $,则 $ n, m $ 同级。不难发现对于任意两个相交的边需要在哈密尔顿回路的内外两侧,否则不合法。于是后面的部分可以通过 2-SAT 解决或扩展域并查集解决。复杂度最终为 $ O(Tn^2) $,可以优化至 $ O(Tn) $。

LG-P4782 【模板】2-SAT 问题

日期:2023.01.30

算法:2-SAT

难度:V

时间复杂度:$ O(n + m) $。

题面:2-SAT 模板。

题解:2-SAT 模板外加 Tarjan SCC缩点 优化即可通过。

CF27D Ring Road 2

日期:2023.01.30

算法:2-SAT

难度:V

时间复杂度:$ O(m^2) $。

题面:LG-P3209 [HNOI2010] 平面图判定 双倍经验。

题解:LG-P3209 [HNOI2010] 平面图判定 双倍经验。

CF613D Kingdom and its Cities

日期:2023.02.02

算法:虚树

难度:V

时间复杂度:$ O(n \log n + \sum S (\log n + \log \sum S )) $。

题面:给定树,多次询问给定点集求最少需要去掉多少条边才能使点集之间的点均不能到达,存在无解。

题解:构建虚树即可,具体地,考虑记录关键点及其 lca 的点,对于关键点,考虑其所有直接连结的子节点如果为关键点那么就会对答案多贡献 $ 1 $,对于非关键点,考虑其直接连结的子节点若关键点的数量大于 $ 1 $,那么删去该点即可,反之将其设为关键点归到祖先考虑。

LG-P4103 [HEOI2014] 大工程

日期:2023.02.02

算法:虚树 树形DP

难度:VI

时间复杂度:$ O(n \log n + \sum S (\log n + \log \sum S )) $。

题面:给定树,多次询问给定点集中任意两个点之间在原树的最短路径的最小值最大值以及和。

题解:构建虚树,然后在虚树中维护子树关键点数量,子树最短和最长的关键点到该点的距离,子树中最短此短最长次长等,维护一下即可。

LG-P2495 [SDOI2011] 消耗战

日期:2023.02.03

算法:虚树

难度:V

时间复杂度:$ O(n \log^2 n + \sum S (\log n + \log \sum S )) $。

题面:给定树,存在边权,多次询问给定不包含 $ 1 $ 的点集求断边最小代价使得 $ 1 $ 与点集内所有点不连通。

题解:构建虚树,边权下放到点权,同时树剖 + 线段树维护树上路径最小边权作为虚树上的边权,然后在虚树上简单 DP 即可。

LG-P3812 【模板】线性基

日期:2023.02.09

算法:线性基

难度:IV

时间复杂度:$ O(n \log n) $。

题面:求序列异或最大值。

题解:线性基模板。

LG-P4151 [WC2011]最大XOR和路径

日期:2023.02.16

算法:线性基

难度:V

时间复杂度:$ O(m \log D) $。

题面:给定带边权无向图,可能有重边自环,求从 $ 1 $ 到 $ n $ 的最大异或和路径。

题解:考虑处理出平面中所有环并丢到线性基中,显然对于一个环走两次是无效的,而对于一条路径以及一个环,从路径到环再从环回来显然会重复经过路径,则该路径贡献被抵消。考虑任意处理出一个路径,并在线性基中找到可以使得该路径上的异或和异或后最大的值输出即可,对于任选路径的正确性,考虑若有两条路径则成环,异或大环后便可以认为完成了从前者路径转换为后者路径。

LG-P3857 [TJOI2008]彩灯

日期:2023.02.16

算法:线性基

难度:IV

时间复杂度:$ O(nm) $。

题面:给定多个 $ 01 $ 串,求不同异或结果的数量。

题解:考虑线性基性质,即从中任意的不同选择异或出来的结果都是不同的,丢到线性基里直接算即可。

LG-P4570 [BJWC2011]元素

日期:2023.02.16

算法:线性基 贪心

难度:IV

时间复杂度:$ O(n \log n) $。

题面:给定 $ n $ 个元素,每个元素有序号和权值,要求在其中选择任意个满足其序号异或和不为 $ 0 $ 且权值和最大。

题解:存在显然贪心,按照权值排序,可以加入就加入,证明显然,考虑若有两元素 $ a, b $ 权值小于 $ c $ 但权值和大于 $ c $,且 $ a \oplus b = c $,则对于选 $ a, b $ 一定可以转换为选择 $ a,c $ 或 $ b, c $,对于 $ \oplus a = b $ 同理,$ \mathrm{QED} $。

LG-P4301 [CQOI2013] 新Nim游戏

日期:2023.02.16

算法:线性基 贪心

难度:IV

时间复杂度:$ O(n \log n) $。

题面:在 Nim 游戏基础上限制第一回合两人均可以拿走任意整堆火柴,可以为 $ 0 $ 但不能全部拿走,求先手必胜第一次最少需要拿走多少火柴。无解输出 -1

题解:问题转化为,在所有火柴堆中选择一个子集,使得这个子集中无任何非空子集异或和为 $ 0 $,发现该限制即为线性基的一般限制,认为每个火柴堆有两个相同权值然后按照 LG-P4570 贪心地取即可。

posted @ 2023-03-05 12:46  Tsawke  阅读(92)  评论(0)    收藏  举报