自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(822)
  • 收藏
  • 关注

原创 Codeforces 1986 G2 数论 + 暴力

再枚举其因子,并根据计数数组统计答案。内数字的最大因子数。按照值域用一个计数数组维护;只处理依次,均摊时间复杂度。不一定是一个排列,则每一个。仅被其因子扫描到,而由于。

2024-07-05 09:49:36 937

原创 AtCoder ABC 365G 凸包 + 二分

则这两种操作对应点的连线都可以被取到。拓展到两个点以上的情况,则可以任取这些点构成的凸包内的任一点。的节点,二分满足约束条件的节点,最后再二分该节点与凸包上次一节点的线性组合。,若此节点不满足约束条件,则任一节点都不满足条件。对于最小化时间,则转化为最大化。,那么将其看作二维平面的点,即。,则他们的任意组合可以表示为。满足约束条件,则单位为。其余情况,我们考虑凸包。

2024-06-19 14:41:08 1026

原创 LeeCode 1987 DP / Trie

用Trie维护子序列集合,树中每一个节点代表一个互异的子序列。维护Trie中子树数量小于2的节点数量,不断插入新元素,同时将新增的树节点计入答案。,则枚举子序列的第二个元素。为首元素的子序列集合为。进行转移,转移的位置是。

2024-06-15 22:28:32 891

原创 LeeCode 1787 DP

个元素,则可以从任一个状态转移过来,那么贪心地选择改动数量最少的状态即可。对于出现在同余类中的取值,直接暴力枚举即可。意义下索引相等的各个元素相同,故可以依次处理每一个同余类。情况下的最小更改元素数。直接枚举每一种取值,时间复杂度。的区间产生影响,故难以直接依次处理每一个元素。观察到满足条件的数组中模。

2024-06-04 23:03:08 1147 1

原创 LeeCode 3165 线段树

考虑不含相邻子序列的最大和,在不带修改的情况下容易想到,以最后一个元素是否被选取为状态进行DP。从线性递推的角度难以处理待修改的情况。从分治的角度考虑,使用线段树维护区间内包含或不包含边界元素的信息,即可快速维护答案。

2024-05-27 13:11:10 280

原创 Codeforces 1955H 最小费用流 / DP

新增源点、汇点,将带权二分图建模为网络流,构造势函数保证边权非负,使用dijkstra算法不断增广。而此处的图具备良好的性质,即每次增广所用的边数。那么对于流量任意的最小费用流,只需在残余网络存在权值为负的路径情况下不断增广。为左右节点构造带权二分图,问题转化为求匹配数任意情况下的最小权匹配。,则塔对敌人造成的伤害与初始化增加的生命值两者的总贡献为正,此时显然取。都是相等的(不妨假设增广路中每条反向边可以抵消一条原边),即。不同塔对敌人的贡献是独立的。的攻击范围,则其对敌人的造成伤害的上界为。

2024-05-02 11:06:22 742

原创 LeeCode 1728 任意图上博弈

具体而言,将博弈双方位置加之先后手状态看作任意图上的一个节点。对于可以确定胜负态的节点,以其为起点,使用类似拓扑序更新的操作不断递推其余节点的状态。的方格,任意图博弈求解时间复杂度为。任意图上博弈,可参考。

2024-04-30 22:38:55 267

原创 LeeCode 3130 DP / 组合数学

可以通过维护前缀和,或者直接利用递推关系作差分,优化掉枚举序列长度这一维。如下采用维护前缀和进行优化,时间复杂度。0/1子段可以分别独立地统计满足条件的序列数量,最后相乘即可。以0为例,假设其子段数量为。那么只需要暴力枚举每一段连续且元素相同的序列长度,递推即可。可以通过枚举连续的0/1的子段的数量统计答案。具体而言,令0的段数量为。,则每一段至少需要分配一个0。故剩余可自由分配的0数量为。,因为0/1子段是交错的,故1的段数量仅有。个桶且每个桶的元素数量不大于等于。的方案数,可以通过容斥原理。

2024-04-29 23:15:35 680

原创 Codeforces 1945G 块状链表 / 堆

三元组唯一地确定,使用堆维护即可。初始化队列元素间顺序仅与元素索引有关,则单独使用一个队列维护,并使用。维护其优先级,仅当此队列中元素的优先级最大值严格小于堆顶元素的优先级,此时弹出堆顶元素。使用块状链表维护队列,链表每个节点维护。个元素,并维护元素的最大值,则可以实现。只关注插入元素间的顺寻,可以根据。

2024-04-27 22:47:10 1047

原创 LeeCode 1896 括号树 + 树形 DP

根据布尔表达式建立一颗括号树,具体而言,出现嵌套括号就新增一个虚拟子节点。建树过程可以用一个栈维护。此括号树满足各个节点的子节点集合是按照计算顺序排列且可以直接计算的节点。最后在树上以表达式取值为状态进行树形DP即可。

2024-03-16 11:28:08 456

原创 LeeCode 546 区间 DP

不在同一轮被移除,则可以枚举分界点更新答案;反之,则难以直接递推。在同一轮被移除的元素数量即可。难以顺序处理,故考虑不断拓展区间。

2024-02-16 22:28:25 853 1

原创 AtCoder ABC 328G 状态压缩 DP + 复杂度分析

另一种方案是枚举分割的段,此时每一个连续的段(除了起始段)操作 1 贡献是。的位置,都至少要分割一次,且仅需这样的分割就可以得到。容易想到两类计算分割贡献的方案。实际上,这是一个宽松的界,对于每一个段的长度。不考虑分割贡献,则需要维护两个变量:集合。,对于每一个状态,可能的段规模为。实际上,只需要维护前者,因为。经过操作 1 变换为排列。,实际上对应的状态数为。,转移时可以直接判断。

2024-02-15 22:14:47 960

原创 Codeforces 1858 E1/E2 树 / 前缀和

此版本允许离线,则根据查询构造出一棵树。这棵树满足性质:每一个查询都对应树上的一条从根节点自顶向下的路径。对于 ‘+’ 及其撤销操作,只用修改一个数字的至多两个位置的信息。使用 std::set 维护数字位置,使用 BIT 维护前缀和。对于撤销操作,维护一个栈即可。一个直观的做法是,维护一个足够大的数组。则 ‘-’ 及其撤销操作转化为不同前缀的。的索引是对应数字在数组最小的,则。、前缀和),像维护栈一样,不断维护。中所有元素的信息,只需要维护前缀。的信息(各个数字出现的位置以及。其实上不必动态地更新。

2024-02-07 20:31:54 908

原创 Codeforces 1860F 计算几何 / 数学

将这些位置逆时针排序,依次处理,每次次序发生交换的点一定是位于数个连续区间,那么把这些可能交换的点单独进行排序,每个点对均摊处理。时,数个点的点积相同,此时左括号置于前面(根据括号的性质,所有前缀和非负,则满足条件)。具体实现上,对于相邻位置。,观察到仅当两个平面的交线的两侧,次序交换。点对,可以得到所有可能出现点次序交换的位置。情况下的次序,不断维护相邻点发生交换的。与上述计算几何方法原理相同,将。两侧,点对的次序固定;,直观上即二维平面的直线随着。

2024-02-03 20:14:52 968

原创 LeeCode AutoX-4 计算几何

判断线段与圆的相交性,若圆心到线段所在直线的最小距离大于半径,则不可能相交;反之,若线段存在位于圆上的端点,则相交;若线段存在位于圆内部的端点,则除了两个端点都位于圆内的情况,其他情况都相交;其余情况,圆心与线段两端点的连线都位于圆心与线段的垂线两侧,此时可以通过内积简单地进行判断。判断两线段相交,一类思路是计算出交点,在判断交点是否处于两条线段上;由于只用判断相交性,不用求交点,可以使用基于ccw函数的做法简单求解,具体而言,用端点表示的两条非平行的线段。分别为两圆半径,则充要条件为。

2023-11-19 16:09:01 220

原创 AtCoder 327G 组合数学

的求解,观察到联通二分图的染色方案只有两种,那么先求出可以黑白染色的二分连通图数量,最后像背包问题一样不断累加联通分量即可。看作一条边并建图,序列对满足条件当且仅当所构造的图为二分图。为将图中节点二分染色后,相同颜色的节点间不存在连边的方案书;根据容斥原理,考虑简单图上部分边没有分配。枚举图中编号最小的节点所在联通分量的情况,则可以容斥得到。条边中至少一条的情况,可以得到。为二分图边数的最大值,其等于。的有序性,每一条边贡献为。代表代标号的节点数为。的简单二分图的方案书;中联通图的数量,则有。

2023-11-07 22:47:06 202

原创 Codeforces 1855E 数学期望 + DP

根据数学期望的线性性质,可以独立地考虑每一个。的情况看作后者消失,则。对答案的贡献,则答案为。

2023-11-02 23:02:48 347

原创 AtCoder ABC239G 最小割集

对于最小割集的求解,求解最大流后,从源点出发在残余网络中 DFS,对所有可达的点打上标记,最终满足。此时答案为新图的最小割。未被标记的节点则属于最小割集。将原图中每个节点拆为入点。的边,对于原图每一个点,

2023-10-14 22:41:45 351

原创 AtCoder ABC324G 启发式合并

个联通分量不断合并的过程,此时使用启发式合并,即规模较小的连通分量向规模较大的连通分量合并,以单个元素合并为基本运算,则基本运算次数为。使用 std::set 分别维护以索引和值为关键字的集合,每次分裂出较小的分量即可。逆则操作顺序考虑,可以看作至多。

2023-10-14 22:12:27 526

原创 AtCoder ABC322G 数学 + 暴力

根据 $1\leq X$,以及 $f(S,a)$ 关于 $a$ 的递增性,可以得到 $b

2023-10-13 16:38:07 253

原创 Codeforces 1878G 枚举 + 树上倍增

答案依赖于查询的路径上的所有点。按位与具备单调性,可以仅枚举路径上各个数位上的。预处理出树上倍增的信息,枚举中间位置更新答案。考虑答案的最大性,容易观察到,仅枚举。出现的深度最大的节点,此时可以处理出。第一次出现的位置,这样的位置规模为。自顶而下维护各个数位上。

2023-10-07 17:00:49 156

原创 AtCoder ABC265G 线段树

直接维护逆序对数量比较困难,考虑到元素值域很小,直接将不同数值对解耦进行维护。具体而言,线段树维护区间。

2023-09-23 13:41:15 188

原创 AtCoder ABC260 G 累积和

的累积和做法,可以不断根据某一维度做差分,直到差分需要处理的规模适当的小;甚至可以按照不同维度分别处理贡献后再累计求和。对每一行计算前缀和,处理每一个询问时暴力枚举每一行进行累加。

2023-09-22 16:49:26 132

原创 AtCoder ABC260 F 暴力 + 鸽巢定理

只要其中一对节点满足被枚举到两次,那么就找到了一个满足条件的四元组。根据鸽巢定理,总时间复杂度为。构造邻接表,枚举规模较大的一侧点集。,枚举每一对连边的端点,这样的点对数量为。满足条件的四元组可以表示为。

2023-09-21 21:14:04 128

原创 AtCoder ABC 319E 中国剩余定理

同时考虑线性同余方程组的求解,相反方向的推论也成立。虽然不一定互素,但转化的思想基本一致,即:令。对于停车点间的每一段距离,仅跟抵达前驱车站模。

2023-09-19 17:23:09 178

原创 AtCoder ARC106 E Hall 定理 + 二分 + 容斥原理 + 高维前后缀和

因为每一个职工的休息日之前总是对应唯一的工作日。预处理出每一天可以选择的用户集合。二分确定工作时长之后,可以统计出对于每一个确定的用户集合。的并集的规模,使用容斥原理,求高维前缀和即可。但二分图规模过大,直接求解最大匹配显然难以胜任。问题可以转化为每一天与职员之间的匹配问题,思路与。,与其存在连边的二分图另一侧节点的数量要大于等于。根据 Hall 定理,若二分图一侧点集。都能被匹配的充要条件是,对于。被选择的日子的集合。做高维后缀和,就能求出。的交集的规模,为了求出。,其恰好能被选择的天数。

2023-09-19 11:41:23 256

原创 AtCoder ABC320 G 二分 + 二分图匹配

答案满足单调性,二分求解。将问题转化为字符串与时间点的匹配问题,单个字符串代表的节点至多向。,仅从字符串节点一侧寻找增广路,匈牙利算法可以做到。段时间至少能匹配一个字符串,故二分上界为。字符串代表的二分图的一侧节点个数为。个时间点连边即可,因为剩余。

2023-09-19 11:23:43 272

原创 P4245 MTT

使用三模数NTT 求解,最后根据中国剩余定理合并即可。考虑到数据范围,需要使用 __int128。范围的多项式,结果多项式的每一项系数上界为。范围的模数以及最高次在。

2023-09-11 17:54:08 402

原创 Codeforces 1625E2 括号树 + BIT

首先利用栈将原始字符串转换为合法的 RBS,不能匹配的括号设为 ‘.’。根据匹配的括号序列构造树,具体而言,遇到左括号,则新建节点向下递归,遇到右括号则回溯。则对于括号树上某一结点。操作 1 仅删除叶子节点与其双亲节点的连边,那么使用 BIT 维护节点的贡献和,以及每个节点的子树数量即可。对于某棵子树的答案,为子树的贡献,加上。为子树的数量,后一项贡献代表了连续的。,其代表的合法括号序列。

2023-08-30 23:08:05 348

原创 Codeforces 1856E2 复杂度分析 + DP

具体做法类似于二进制拆分,不断将相同的值合并,最终每一个不同的值仅有常数个,则不同的值数量为。那么需要在值域上将子树的节点左右划分,那么需要求解所有子树的子集中,子树规模。考虑最坏情况,即平衡的多叉树,容易观察到所有背包 DP 的复杂度为。的每一棵子树,其所有节点在最优情况下仅有。可以独立考虑每一个固定的。的和最接近所有子树和的。对于上述背包问题,满足。

2023-08-17 19:24:09 151

原创 Codeforces 461B 树形 DP

的联通分量是否存在一个黑色节点 ,同时其余联通分量仅包含一个黑色节点情况下,划分方案的数量。DFS 求解,对于每一条连向子节点的边,考虑是否删去这条边,进行状态转移即可。为根的子树中,包含了。

2023-08-17 15:33:36 109

原创 Codeforces 1619H 分块

若排列保持不变,可以预处理后倍增求解,但对于会改变排列的操作 1,则难以胜任。考虑分块,对每个位置。同理),那么只需要重新计算这些位置的。单次操作 2 查询复杂度。,单次操作 1 复杂度。

2023-08-07 09:20:49 160

原创 HDU 6391 组合数学 + DP

异或进来后,异或和为 0 和 1 的数量,对应的贡献为。,这些数字异或和中 1 的数量为。之前出现过的情况,对应的贡献为。可以为任意数字,那么要从。的排列,最后答案除以。

2023-07-31 21:05:22 185

原创 Codeforces 1579G DP / 二分 + bitset

用 std::bitset 维护当前的可能位置,初始位置可能位于。时,覆盖区域的最小值。枚举左右方向递推即可。次移动后所在位置与覆盖区域最左侧位置相差。中的任一个位置,递推即可。

2023-07-29 17:42:07 309

原创 LeeCode 770 后缀表达式

将中缀表达式转换为后缀表达式并同时计算。带变量的项当作多项式计算,方便起见,实现上加减法不对同类项合并系数,而是最后输出答案时同一合并。

2023-07-29 09:44:39 234

原创 P1175 后缀表达式

编码运算符的优先级,线性复杂度将中缀表达式转换为后缀表达式。为了方便输出,可以用类似对顶栈的结构,初始时右侧栈为后缀表达式;对于每一步计算,右侧栈不断弹出数字到左侧栈,直到扫描到第一个运算符。

2023-07-28 19:54:11 201

原创 Codeforces 1828F 树的重心 + BIT

树的重心至少 1 个,至多 2 个。树存在·2 个重心,当且仅当节点数 $n$ 为偶数,且重心的最大子树规模为 $mx=n/2$。题目所求为 $n-2\cdot mx$。需要动态维护以树的重心为根的最大子树规模。

2023-07-27 12:18:52 124

原创 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 231

原创 NC200204 数位 DP

可以独立考虑每一位是否合法。维护数字上下界的状态,枚举三个数字,仅对合法的状态进行转移。数位 DP 求解即可,时间复杂度。

2023-07-14 22:52:56 162

原创 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 341

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除