- 博客(813)
- 收藏
- 关注
原创 LeeCode 1896 括号树 + 树形 DP
根据布尔表达式建立一颗括号树,具体而言,出现嵌套括号就新增一个虚拟子节点。建树过程可以用一个栈维护。此括号树满足各个节点的子节点集合是按照计算顺序排列且可以直接计算的节点。最后在树上以表达式取值为状态进行树形DP即可。
2024-03-16 11:28:08 375
原创 LeeCode 546 区间 DP
不在同一轮被移除,则可以枚举分界点更新答案;反之,则难以直接递推。在同一轮被移除的元素数量即可。难以顺序处理,故考虑不断拓展区间。
2024-02-16 22:28:25 790 1
原创 AtCoder ABC 328G 状态压缩 DP + 复杂度分析
另一种方案是枚举分割的段,此时每一个连续的段(除了起始段)操作 1 贡献是。的位置,都至少要分割一次,且仅需这样的分割就可以得到。容易想到两类计算分割贡献的方案。实际上,这是一个宽松的界,对于每一个段的长度。不考虑分割贡献,则需要维护两个变量:集合。,对于每一个状态,可能的段规模为。实际上,只需要维护前者,因为。经过操作 1 变换为排列。,实际上对应的状态数为。,转移时可以直接判断。
2024-02-15 22:14:47 848
原创 Codeforces 1858 E1/E2 树 / 前缀和
此版本允许离线,则根据查询构造出一棵树。这棵树满足性质:每一个查询都对应树上的一条从根节点自顶向下的路径。对于 ‘+’ 及其撤销操作,只用修改一个数字的至多两个位置的信息。使用 std::set 维护数字位置,使用 BIT 维护前缀和。对于撤销操作,维护一个栈即可。一个直观的做法是,维护一个足够大的数组。则 ‘-’ 及其撤销操作转化为不同前缀的。的索引是对应数字在数组最小的,则。、前缀和),像维护栈一样,不断维护。中所有元素的信息,只需要维护前缀。的信息(各个数字出现的位置以及。其实上不必动态地更新。
2024-02-07 20:31:54 839
原创 Codeforces 1860F 计算几何 / 数学
将这些位置逆时针排序,依次处理,每次次序发生交换的点一定是位于数个连续区间,那么把这些可能交换的点单独进行排序,每个点对均摊处理。时,数个点的点积相同,此时左括号置于前面(根据括号的性质,所有前缀和非负,则满足条件)。具体实现上,对于相邻位置。,观察到仅当两个平面的交线的两侧,次序交换。点对,可以得到所有可能出现点次序交换的位置。情况下的次序,不断维护相邻点发生交换的。与上述计算几何方法原理相同,将。两侧,点对的次序固定;,直观上即二维平面的直线随着。
2024-02-03 20:14:52 910
原创 LeeCode AutoX-4 计算几何
判断线段与圆的相交性,若圆心到线段所在直线的最小距离大于半径,则不可能相交;反之,若线段存在位于圆上的端点,则相交;若线段存在位于圆内部的端点,则除了两个端点都位于圆内的情况,其他情况都相交;其余情况,圆心与线段两端点的连线都位于圆心与线段的垂线两侧,此时可以通过内积简单地进行判断。判断两线段相交,一类思路是计算出交点,在判断交点是否处于两条线段上;由于只用判断相交性,不用求交点,可以使用基于ccw函数的做法简单求解,具体而言,用端点表示的两条非平行的线段。分别为两圆半径,则充要条件为。
2023-11-19 16:09:01 189
原创 AtCoder 327G 组合数学
的求解,观察到联通二分图的染色方案只有两种,那么先求出可以黑白染色的二分连通图数量,最后像背包问题一样不断累加联通分量即可。看作一条边并建图,序列对满足条件当且仅当所构造的图为二分图。为将图中节点二分染色后,相同颜色的节点间不存在连边的方案书;根据容斥原理,考虑简单图上部分边没有分配。枚举图中编号最小的节点所在联通分量的情况,则可以容斥得到。条边中至少一条的情况,可以得到。为二分图边数的最大值,其等于。的有序性,每一条边贡献为。代表代标号的节点数为。的简单二分图的方案书;中联通图的数量,则有。
2023-11-07 22:47:06 149
原创 Codeforces 1855E 数学期望 + DP
根据数学期望的线性性质,可以独立地考虑每一个。的情况看作后者消失,则。对答案的贡献,则答案为。
2023-11-02 23:02:48 275
原创 AtCoder ABC239G 最小割集
对于最小割集的求解,求解最大流后,从源点出发在残余网络中 DFS,对所有可达的点打上标记,最终满足。此时答案为新图的最小割。未被标记的节点则属于最小割集。将原图中每个节点拆为入点。的边,对于原图每一个点,
2023-10-14 22:41:45 233
原创 AtCoder ABC324G 启发式合并
个联通分量不断合并的过程,此时使用启发式合并,即规模较小的连通分量向规模较大的连通分量合并,以单个元素合并为基本运算,则基本运算次数为。使用 std::set 分别维护以索引和值为关键字的集合,每次分裂出较小的分量即可。逆则操作顺序考虑,可以看作至多。
2023-10-14 22:12:27 406
原创 Codeforces 1878G 枚举 + 树上倍增
答案依赖于查询的路径上的所有点。按位与具备单调性,可以仅枚举路径上各个数位上的。预处理出树上倍增的信息,枚举中间位置更新答案。考虑答案的最大性,容易观察到,仅枚举。出现的深度最大的节点,此时可以处理出。第一次出现的位置,这样的位置规模为。自顶而下维护各个数位上。
2023-10-07 17:00:49 90
原创 AtCoder ABC260 G 累积和
的累积和做法,可以不断根据某一维度做差分,直到差分需要处理的规模适当的小;甚至可以按照不同维度分别处理贡献后再累计求和。对每一行计算前缀和,处理每一个询问时暴力枚举每一行进行累加。
2023-09-22 16:49:26 68
原创 AtCoder ABC260 F 暴力 + 鸽巢定理
只要其中一对节点满足被枚举到两次,那么就找到了一个满足条件的四元组。根据鸽巢定理,总时间复杂度为。构造邻接表,枚举规模较大的一侧点集。,枚举每一对连边的端点,这样的点对数量为。满足条件的四元组可以表示为。
2023-09-21 21:14:04 81
原创 AtCoder ABC 319E 中国剩余定理
同时考虑线性同余方程组的求解,相反方向的推论也成立。虽然不一定互素,但转化的思想基本一致,即:令。对于停车点间的每一段距离,仅跟抵达前驱车站模。
2023-09-19 17:23:09 88
原创 AtCoder ARC106 E Hall 定理 + 二分 + 容斥原理 + 高维前后缀和
因为每一个职工的休息日之前总是对应唯一的工作日。预处理出每一天可以选择的用户集合。二分确定工作时长之后,可以统计出对于每一个确定的用户集合。的并集的规模,使用容斥原理,求高维前缀和即可。但二分图规模过大,直接求解最大匹配显然难以胜任。问题可以转化为每一天与职员之间的匹配问题,思路与。,与其存在连边的二分图另一侧节点的数量要大于等于。根据 Hall 定理,若二分图一侧点集。都能被匹配的充要条件是,对于。被选择的日子的集合。做高维后缀和,就能求出。的交集的规模,为了求出。,其恰好能被选择的天数。
2023-09-19 11:41:23 135
原创 AtCoder ABC320 G 二分 + 二分图匹配
答案满足单调性,二分求解。将问题转化为字符串与时间点的匹配问题,单个字符串代表的节点至多向。,仅从字符串节点一侧寻找增广路,匈牙利算法可以做到。段时间至少能匹配一个字符串,故二分上界为。字符串代表的二分图的一侧节点个数为。个时间点连边即可,因为剩余。
2023-09-19 11:23:43 119
原创 P4245 MTT
使用三模数NTT 求解,最后根据中国剩余定理合并即可。考虑到数据范围,需要使用 __int128。范围的多项式,结果多项式的每一项系数上界为。范围的模数以及最高次在。
2023-09-11 17:54:08 118
原创 Codeforces 1625E2 括号树 + BIT
首先利用栈将原始字符串转换为合法的 RBS,不能匹配的括号设为 ‘.’。根据匹配的括号序列构造树,具体而言,遇到左括号,则新建节点向下递归,遇到右括号则回溯。则对于括号树上某一结点。操作 1 仅删除叶子节点与其双亲节点的连边,那么使用 BIT 维护节点的贡献和,以及每个节点的子树数量即可。对于某棵子树的答案,为子树的贡献,加上。为子树的数量,后一项贡献代表了连续的。,其代表的合法括号序列。
2023-08-30 23:08:05 287
原创 Codeforces 1856E2 复杂度分析 + DP
具体做法类似于二进制拆分,不断将相同的值合并,最终每一个不同的值仅有常数个,则不同的值数量为。那么需要在值域上将子树的节点左右划分,那么需要求解所有子树的子集中,子树规模。考虑最坏情况,即平衡的多叉树,容易观察到所有背包 DP 的复杂度为。的每一棵子树,其所有节点在最优情况下仅有。可以独立考虑每一个固定的。的和最接近所有子树和的。对于上述背包问题,满足。
2023-08-17 19:24:09 110
原创 Codeforces 461B 树形 DP
的联通分量是否存在一个黑色节点 ,同时其余联通分量仅包含一个黑色节点情况下,划分方案的数量。DFS 求解,对于每一条连向子节点的边,考虑是否删去这条边,进行状态转移即可。为根的子树中,包含了。
2023-08-17 15:33:36 77
原创 Codeforces 1619H 分块
若排列保持不变,可以预处理后倍增求解,但对于会改变排列的操作 1,则难以胜任。考虑分块,对每个位置。同理),那么只需要重新计算这些位置的。单次操作 2 查询复杂度。,单次操作 1 复杂度。
2023-08-07 09:20:49 70
原创 HDU 6391 组合数学 + DP
异或进来后,异或和为 0 和 1 的数量,对应的贡献为。,这些数字异或和中 1 的数量为。之前出现过的情况,对应的贡献为。可以为任意数字,那么要从。的排列,最后答案除以。
2023-07-31 21:05:22 141
原创 Codeforces 1579G DP / 二分 + bitset
用 std::bitset 维护当前的可能位置,初始位置可能位于。时,覆盖区域的最小值。枚举左右方向递推即可。次移动后所在位置与覆盖区域最左侧位置相差。中的任一个位置,递推即可。
2023-07-29 17:42:07 187
原创 LeeCode 770 后缀表达式
将中缀表达式转换为后缀表达式并同时计算。带变量的项当作多项式计算,方便起见,实现上加减法不对同类项合并系数,而是最后输出答案时同一合并。
2023-07-29 09:44:39 207
原创 P1175 后缀表达式
编码运算符的优先级,线性复杂度将中缀表达式转换为后缀表达式。为了方便输出,可以用类似对顶栈的结构,初始时右侧栈为后缀表达式;对于每一步计算,右侧栈不断弹出数字到左侧栈,直到扫描到第一个运算符。
2023-07-28 19:54:11 145
原创 Codeforces 1828F 树的重心 + BIT
树的重心至少 1 个,至多 2 个。树存在·2 个重心,当且仅当节点数 $n$ 为偶数,且重心的最大子树规模为 $mx=n/2$。题目所求为 $n-2\cdot mx$。需要动态维护以树的重心为根的最大子树规模。
2023-07-27 12:18:52 66
原创 Codeforces 914E 点分治
一个字符串存在一个回文串排列,当且仅当字符串中出现次数为奇数的字符不超过一个。以 $v$ 为根,$a_u$ 代表根到节点 $u$ 间字母的奇偶性,则通过 $v$ 的路径 $u\rightarrow w$ 可以表为 $a_u\oplus a_w\oplus a_v$。考虑点分治。每次处理仅考虑通过重心的路径。对于重心,依次考虑子树贡献。对于非重心 $u$,这样的路径的一个端点必然在 $u$ 的子树内,递归相加即可。总时间复杂度 $O(20n\log n)$。
2023-07-26 22:59:00 132
原创 NC200204 数位 DP
可以独立考虑每一位是否合法。维护数字上下界的状态,枚举三个数字,仅对合法的状态进行转移。数位 DP 求解即可,时间复杂度。
2023-07-14 22:52:56 138
原创 AtCoder practice contest B 归并排序 + 二分 / 贪心 + 信息熵
对于 $n = 26$ 的情况,归并排序最坏情况下需要 $99$ 次比较。对于 $n=5$ 的情况,比较 $c_1,c_2$,再比较 $c_3,c_4$,接着比较两组数据的最小者(不妨假设为 $c_1$),此时得到了一个有序的三元组 $c_1,c_3,c_4$,二分求解 $c_5$ 的位置并插入,此时 $c_1$ 右侧的元素至多为 $3$,再次二分插入 $c_2$ 即可。由于插入一个有序三元组需要二分比较的次数为 $2$,故总比较次数 $3+2+2=7$ 满足条件。
2023-07-02 17:28:11 185
原创 Codeforces 1828E Manacher + DP
表示为唯一的分割形式。Manacher 求解以各个位置为中心的回文串最长长度,用一个栈维护有序的回文串中心位置,不断弹出无法覆盖当前位置的元素,则可以得到。中以各个位置为左边界的最短回文串。DP 求解以各个位置为边界的答案即可。观察到对于任一个 “beautiful string”对于此类后推形式的 DP,倒序递推较为方便,可以以。为左边界的最短回文串,将。
2023-07-01 17:05:35 307
原创 Codeforces 1828D2 枚举
先考虑简单情况,即 $n\leq 5\cdot 10^3$,可以直接枚举 $O(n^2)$ 个子区间。固定左端点,拓展右端点的同时维护需要排序的段(可以通过求解新增元素在有序区间的插入位置做到)。总时间复杂度 $O(n^2\log n)$。
2023-06-28 12:05:13 79
原创 Codeforces 1754F Dijkstra
观察到一张浴床至多移动一次,否则可以构造出花费更小的方案。将浴床的移动,看作将一个空位 ‘.’ 移动到了之前浴床的某一半所占据的格子上。方案的构造可能涉及多个浴床的移动。考虑建图,求解从所有空位 ‘.’ 出发,经过不断地移动抵达某个位置的花费。对于图中相邻格子,两者横纵坐标求和的奇偶性不同。位于某一个位置的空位 ‘.’ 只能移动到与其奇偶性相同的位置上。那么枚举相邻格子,答案为空位 ‘.’ 抵达两者的花费之和。
2023-06-13 15:20:54 1715
原创 Codeforcs 1732C2 暴力
方便起见,区间表示为左闭右开。观察到 $f(l,r)\geq f(l',r'),[l',r')\in [l,r)$,满足单调性,则 $[l,r)$ 子区间最大 $f$ 等于 $f(l,r)$。当同一数位出现大于一次 $1$ 时,这一数对 $f$ 的贡献大于 $0$,那么暴力枚举左右边界即可。时间复杂度 $O\Big(q\log^2(\max a_i)\Big)$。
2023-05-30 22:59:56 565
原创 Codeforces 1611G 贪心 + 二分 / Dilworth 定理 + DP
根据 Dilworth 定理,最小链划分等于最长反链。,维护一个已使用的 Robot 集合,对于任一个有物品的节点。,二分求解恰好能走到此节点的 Robot,安排其走到。,DP 求解最长反链即可。此处反链上任一对节点。奇偶性不变,故可以根据奇偶性分别求解。反之,新增 Robot。
2023-05-29 22:33:45 481
原创 CodeChef - COVERING 高维前后缀和 + 容斥原理
令 $$T(S) = \sum\limits_{(A\cup B\cup C) = S} F(A)G(B)H(C)$$ 二进制状态压缩表示 $S$,则 $R(S)$ 是关于 $T(S)$ 的高维后缀和,即 $$R(S)=\sum\limits_{A\in S}T(A)$$ 问题转换为如何求解 $T(S)$。考虑每一个元素是否存在,即二进制表示下每一位是否为零,可以应用容斥原理得到
2022-10-28 17:57:56 673 1
原创 Codeforces 1535F 字符串 + 倍增 + BIT
若字符串 $a,b$ 的字符多重集合不相等,则 $f(a,b) = 1337$。反之,将 $a,b$ 整个串做排序必然相等,则 $f(a,b)\leq 2$。此时只用考虑 $f(a,b)=1$ 的情况。若仅对 $a$ 进行一次子串 $[l,r)$ 排序使 $a = b$,则字典序意义下 $a>b$;且 $a,b$ 在 $l$ 左侧的前缀与 $r$ 右侧的后缀相等,则字典序意义下 $a,b$ 的反串 $a^{\prime},b^{\prime}$ 满足 $a^{\prime}
2022-10-27 20:37:53 423
原创 P8193 [USACO22FEB] 高维前缀和
令 $s = \sum a_i$,$presum_i = \sum_{j\leq i}a_j$。对于第 $i$ 个询问,存在满足条件操作的充要条件是 $q_i\vert s$。令 $x = \sum [presum_i \mod q_i = 0]$。 至少需要合并的次数为 $n-x$,至少需要分裂的次数为 $s/q_i-x$,且这样的操作可以满足条件。答案为 $n + s/q_i -2x$。
2022-10-20 19:34:55 331
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人