- 博客(168)
- 收藏
- 关注
原创 25杭电暑期第二场
二位数点,下标转化两个排列,表示两次比赛的排名,对每个人,问删除多少人可以让他变成两次比赛都是第一?双序列问题,考虑枚举一个,数据结构维护另外一个。并且可以对一个序列记录每个元素在另一个序列里的下标,这个trick在lcs最长公共子序列里也出现过,可以把一个序列变成序列中元素在另一个序列里的下标,然后lcs就可以变成对这个下标数组求lis最长上升子序列。
2025-07-22 23:04:05
598
原创 25杭电暑期第一场
在同一颜色的边上移动,只用付出1代价,问1到n最短路?相同颜色的边形成了一些连通块,每个连通块内点都只需要1代价即可互达,考虑用一个虚点连接连通块内所有点,每个点和虚点都要双向边,每个点借助虚点移动到另一个点代价只要1,但是有两条边,所以考虑给入边代价1,出边代价0.然后原图中的边就可以忽略了,我们通过虚点的边已经完全表达了原图的规则,直接跑最短路即可这里边权只有01,可以01bfs,不用dij。
2025-07-22 22:28:34
457
原创 李超线段树
李超树可以保存多个直线/线段,Olog2n))插入线段,然后Ologn))查询某个坐标处最小/大的线段对每个区间,维护这里最小的线段的参数,一般就是kb表示ykxb。查询时就类似线段树单点查询,一直递归到叶子节点。每次更新时,首先会把一个线段的区间拆分成Ologn))个线段树上的区间,然后对于这些区间,再进行下传,直到到达叶子,每层只会往左右儿子中的一个下传,传Ologn))层,故更新总复杂度Olog2n))
2025-07-19 23:18:49
651
原创 ABC320 dp状态设计
最后最优解可能加油没加满,枚举终态里的jk,注意一定有k<=j,因为j之后没有加油站了,走到n再回来油量不可能变多。但是还要求从n返回1,并且每个加油站只能用一次。dp转移信息不足,时间也还有富余,考虑状态增加一个维度,注意油量有上限,加完了,多的要扔掉,也就是状态里油量大于h的,都映射到等于h的位置。表示考虑前i个加油站,1到n时经过i,还剩j升油,n到1时经过i,还剩k升油。表示到了第i个加油站,还剩j升油的最小代价。如果只要求从1到n,显然可以。
2025-07-14 21:26:01
126
原创 AB319 数论 公共周期 预处理 补图上bfs+dp 分层图求最短路计数
数论 预处理有多个周期的题目都考虑lcm求公共周期。注意到pi<=8,那么虽然站多,出门的时刻选择多,整个发车是有周期的,且这个周期最大为lcm12...8<=840,也就是出门时刻x超过840的情况,都可以等价于xmod840的情况暴力预处理840以内的情况即可。
2025-07-14 21:19:02
395
原创 ABC318枚举+贪心 网络流+拆点
思维 贪心每个手长度li,可以抓住k−likli内的一个东西,k是身体所在位置,有和手等量的东西在数轴上,问能抓住所有东西的身体个数?身体必须在整点。首先可以发现,整个数轴上的点可以分段,每段内要么都合法,要么都不合法。因为可以这样分段:注意到触手和东西都不多n100,身体位置不确定,但是东西位置是确定的,你那么可以枚举哪个手抓住了那个东西,这样身体就必须在一个区间内,这些区间的边界,把整个数轴划分成了多个部分。
2025-07-14 19:34:54
693
原创 ABC315 模拟 dp+思维 exgcd求解个数
模拟 转化到值域注意到删除次数不会太多,可以直接模拟。看看需要记录啥,首先肯定要维护每一行的元素种类数,这需要开一个种类数数组(只有一种才能消除),还要维护每行每种颜色的出现次数。并且还要记录每行的剩余元素个数(剩余不少于2才能消除)每轮分两个阶段,先找到所有可消除的行列,然后再统一消除。注意不能找到了直接消除,否则可能破坏其他行/列的消除条件。消除时,消除一行,会把这一行每个元素所在列的元素个数,元素种类数都更新。
2025-07-14 18:58:36
730
原创 ABC314 至少装满背包+期望DP 并查集+集合加
期望DP 至少装满型背包 概率背包多个转盘,每个转盘转动有代价,有等概率的多个奖励,问至少得到m奖励的代价的期望?首先期望问题还是要倒推,dpi表示还差i分就能得到至少m的奖励的期望代价。现在有几个问题:第一,多个转盘怎么处理。其实这个转盘是类似背包问题的一个东西,每个转盘可以看成背包里的一个东西,这是完全背包可以任意选择,那么我们可以外层枚举物品(转盘),内层枚举容量,然后允许滚动背包一轮内多次更新。也可以外层枚举容量,内层枚举东西,对每个容量,只能选一个转盘,当然取最小。
2025-07-14 18:36:20
373
原创 欧拉序预处理LCA,查最值下标ST表
欧拉序是在递归进入和回溯时都记录序号,得到的一个树上访问顺序,每个点都会访问两次,长度2n。然后我们取每个节点在欧拉序里第一次出现的位置pos,就会具有一个性质:两点的lca,一定在欧拉序中,这两点的pos之间出现过。举例来讲,对于这样一个树欧拉序就是122133可以看到1确实在23的中间出现过。两点的lca还满足深度比这两点小,所以我们可以把查lcaxy转化为在欧拉序列上,minposxposymaxposxposy)]
2025-07-14 18:01:26
348
原创 ABC312 格点思想 贪心+二分 树上路径计数
格点思想空间中多个互不重合的长方体,端点都在0100,两个长方体有一个面公共面积不为0即为接触,问每个长方体和多少个长方体接触?n2e5个长方体,直接做会爆炸。但是这种整点上,并且值域不大的计算几何,可以考虑直接枚举每个格点。(其实格点思想就类似于一般问题里的考虑转成值域上思考)这里就是我们注意到在这个范围内,只有3∗1003个1∗1的格点,并且由于长方体互不重合,每个格点最多又两个长方体,即两侧各一个。
2025-07-13 18:05:34
601
原创 ABC311 二维前缀和+二分 前缀和优化DP 枚举+单调栈
二位前缀和 二分一个矩阵上有一些洞,问有多少个正方形子矩阵不含洞?考虑枚举正方形的左上角,这个左上角对应多个边长递增的正方形,注意到边长越大,越可能包含洞,对边长二分,得到最大的不含洞的边长,不超过该边长的都是合法的。
2025-07-13 17:30:07
273
原创 ABC310爆搜剪枝 位运算增量法dp 状压+概率dp
爆搜剪枝每个人都要分到一个队伍,t个队伍,每个队伍至少一个人,一些人有矛盾,不能在一个队伍,问合法的分配方案数?数据不大考虑爆搜,两个数组分别维护每个人所在队伍编号,每个队伍的人数。每次分配一个人时,检查所有和他有矛盾的人都在哪个队伍,这些队伍不能去。利用每支队伍的人数,维护不为空的队伍个数,最后所有人都安排好了,还需要队伍个数等于t才合法直接这样会tle,要么加一个可行性剪枝,即剩余人数不足以使得每个队伍都不为空,就剪掉。要么考虑状压。
2025-07-13 17:08:33
340
原创 ABC309 三位偏序存在性 线段树扫描线
注意到我们只要求存在性,不用计数,而平时我们的二位数点为了计数实际上是把线段树的值用来存出现次数了,这里不用计数了就可以拿来存别的,比如可以存第二维度是某个值时,第三维度的最小值,这样我们对线段树区间查就能得到,前两个维度都比当前更小的元素中,第三维度的最小值,即可判断三个维度更小的元素是否存在。两个维度很好做,一个维度排序,一个维度当作下标存到线段树,第三个维度呢?每个东西三个维度,问是否存在一个东西三个维度都严格大于另一个东西?
2025-07-13 16:46:15
178
原创 AC自动机
AC自动机可以看成kmp+trie,可以处理多个模式串的匹配。首先对对个模式串建trie,然后每个节点都有个fail指针,类似于kmp里的失配指针,表示如果匹配到这一步失配了,下一步应该从哪里继续,相当于同时对多个串维护了失配指针,那么给出一个文本串,我们可以同时在它上面检测多个模式串,这个过程可以看成在trie树构成的自动机上转移,因此也叫ac自动机。
2025-07-10 11:47:09
986
原创 ABC308 贪心+堆 线段树分治/xor性质+堆
贪心 堆模拟一堆衣服一堆优惠券,每个优惠券要求原价不低于li才能用,用了减didi<=li,每个衣服最多用一个券,每个券最多用一次,问买所有衣服的最小开销?每个优惠有门槛的,如果同时有多个能用的,一般都贪心,先用折扣大的,再用门槛高的,要不现在不用后面就用不上了。但这样模拟每个衣服用什么券,wa了。考虑转变思路,衣服肯定都要买,衣服总原价固定的,我们肯定要尽可能把每个优惠券都用出去,不用计较每件衣服是不是达到最优,要计较的是能不能尽可能多的用优惠。
2025-07-10 10:51:49
541
原创 ABC307 环dp 最短路+思维
环dp长度n的环,每个元素m种选择,问相邻元素不相同的方案数?环问题先想链上怎么解决,再想怎么加状态变成环,一般就是增加一个维度记录第一个元素,然后dp转移的时候考虑最后一个元素,是要和第一个元素相邻的,是否满足相邻元素的约束对于这道题,如果是个链,属于经典问题,显然第一个元素有m种选择,后面元素要和左侧不相同,只有m-1种选择对于环,我们还要考虑最后一个元素和开头元素是否相同,实际上不用记录具体是m种中的哪种,只要记录最后一个和第一个是不是同一种即可。这可以用0/1表示。
2025-07-10 10:27:16
479
原创 ABC306 对顶堆 贡献法+DS
模拟 对顶堆每次把序列里axy,问每次修改后序列的前k大?k固定,但是带修改元素的前k大,考虑类似对顶堆的思路,维护两个set,第一个只存前k大,第二个存剩余元素。每次修改,可以视为先删除,再插入,插入后还要考虑集合大小是否合法。具体来说,用一个数组记录每个元素在哪个集合里,如果修改的元素在前k大集合里,先删除,然后插入非前k大集合,这时前k大集合缺个元素,从非前k大集合里选最大的,插入。
2025-07-10 10:02:42
244
原创 ABC305 交互+dfs 矩阵快速幂优化ac自动机dp
交互 dfs每次给出当前点的相邻点,可以选择一个相邻点移动过去,只有2n次机会,要从1到n注意到dfs一遍,其实我们在图上的移动次数最大就是2n的,而dfs一遍一定能访问所有点,包括n,所以直接模拟dfs即可,vis记录已访问的点,到了n直接输出ok,然后exit。
2025-07-10 09:50:46
747
原创 ABC304 枚举因子 因子容斥
但是问题是,两个不同的因子,可能形成相同的最终方案,需要去重,注意到其实一个因子的因子的方案,都包含在这个因子里面了,比如6肯定包含了2,3的所有方案,把长度2的方案循环三次就是长度6的方案了。所以我们需要从小到大处理因子,然后对于每个因子,把他的因子的方案减掉。一个人的上班情况给出,另一个人的上班情况循环,只用决定第一个循环节。但必须每天至少有一个人上班,问第二个人有多少种上班方案。显然可以枚举天数的因子,第二个人的循环节必是一个因子,然后第二个人必须覆盖上第一个人没上班的天,这可以。
2025-07-09 22:57:19
204
原创 ABC302 置换环 有相同元素
本题就是存在相同元素,这种就不好做了,但是为了能做,加的条件是元素种类只有4种,于是只有二元,三元,四元环,我们可以直接枚举每种环的元素组合,比如二元环可能是。,这样图上会形成若干个环,每个长度n的环,可以交换n-1次全部排好,这就是置换环的基本思路。先排序,然后把原数组元素和排序后数组相同位置的元素连边,也就是。但是一般的置换环,要求元素互不相同,否则情况会变复杂。,这个枚举增长很快,所以只有元素种类不多才能这样做。可以交换任意两个位置的排序,问排序次数,考虑置换环。
2025-07-09 22:47:30
322
原创 ABC301 问题转化+旅行商问题 虚点建图+最短路
旅行商dp,问题转化网格图上有18个奖励,问用时不超过t,能得到的最多奖励个数?18显然可以考虑状压,变成类似旅行商dp,状态里保存目前的奖励集合,dp值保存用时,最后检查用时不超过t,且位于终点的所有状态,计算最大集合大小但是还有个网格图,如果我们网格图上bfs的同时维护状压,会发现状态里要存网格图上坐标+集合状态,太复杂了。但实际上这个网格图的唯一作用,就是给我们这些点之间两两的距离,可以先在网格图上bfs求出任意两个奖励之间两两距离,然后就抽象成一个一般的旅行商了,可以不用管这个网格图了。
2025-07-08 10:05:00
740
原创 ABC300 概率dp 滑窗+思维
概率DP 记忆化搜索每次给计数器乘上骰子的点数,问变成n的概率,n1e18?看起来大,但是考虑到乘法增长很快,状态并不多,可以考虑dp,然后状态是离散的,考虑记忆化搜索。求概率虽然可以从初态开始往后推,但是记忆化搜索比较适合把终态定为边界,所以这里考虑从把终态概率设为1,然后在dfs返回的时候乘上转移过去的概率,这样也是等价的,每一步转移的概率也都乘上了需要注意的是,骰子摇出来1,会回到当前状态,但这个实际上是无意义的,因为我们不是在算步数的期望之类的,转移里没有+1之类的,转移方程就是d。
2025-07-08 09:52:08
935
原创 ABC299 BFS+思维 本质不同子序列+枚举
BFS 思维可以把一些点染成黑色,给出一些点到最近的黑色的距离,问能否找到一个染色方案满足这些要求。数据允许On2,那么可以对于每个到黑色点距离有要求的点为起点,进行BFS,搜到这个指定距离d为止,并把距离小于d的点标记为必须不染色,距离恰为d的点标记为染色,并对每个点保存所有距离为d的点最后对每个点,检查他所有距离为d的点中,是否至少有一个点,没有被标记为必须不染色,如果存在那么这个点的要求可以满足,否则无解。
2025-07-08 09:23:59
914
原创 ABC298 概率DP 枚举+set
概率DP两个人赛跑,先到n的人获胜,问先手获胜的概率?看似博弈,但是两个人都无法影响另一个人的决策,实际上就是状态里分别保存两个人的位置的概率DP需要注意的是一个人到了终点,游戏必须立即结束,不能继续转移,以及状态里需要记录当前该谁动了。
2025-07-07 23:34:02
150
原创 ABC297 堆求第K小 容斥
堆 第K大多种物品,可以随便选,求价值和的第K大,一个价值和多次出现只计算第一次出现K不是很大的第K大,可以考虑堆模拟。每次取出一个元素,都把他的直接后继加入,直接后继就是比它大的元素里最小的几个,这样可以始终保证堆取出来的是当前最小的。然后还要记录一个值是否出现过。
2025-07-07 23:27:30
194
原创 ABC296 博弈+拓扑排序 思维+逆序对
博弈 拓扑排序一个图,先手给一个步数,后手选一个起点,必须在从这个起点出发,走完这个步数后在一个特定终点,问多轮游戏有多少轮是后手必胜的后手必胜,注意到是在先手指定的步数任意的情况下,那么只有终点在在环上,是后手必胜的,否则先手可以给个很大的步数,让走完之后不可能在这个终点所以拓扑排序计算非环上点个数。
2025-07-07 23:23:30
951
原创 ABC293 并查集 矩阵快速幂 数据分治
并查集问图中有几个环,几个链?初始把每个点都当成一个链,并查集合并时,如果一个边两端在一个集合,那链-1,环+1,否则链-1。
2025-07-06 10:17:41
1082
原创 ABC292 dfs 计算几何 二分
图论dfs问是否所有连通块的点数都等于边数先搜出来每个连通块的点集,然后枚举每个连通块中的点,检查他们的边是否都在当前连通块中。
2025-07-06 09:56:43
223
原创 ABC279 三分/求导 思维 并查集实现
下落时间根据重力加速度g可得,开始前可以花Bx时间把g加x,问总时间最小值?总时间即为gxABx,这是个下凹函数,可以考虑三分/二分导数,也可以直接求导找导数为0点。
2025-07-04 10:57:18
1054
原创 ABC278 时间戳 二维滑窗 状压+博弈dp
时间戳操作二可以维护一个addtag,操作一是赋值,会覆盖前面所有的结果,考虑时间戳思想,对于每个元素维护一个时间戳,表示最后一次操作1的时间,这样执行2,3时,看最近一次操作1的时间戳,是否等于当前元素记录的最后一次时间戳,如果等于,说明对它进行的操作2都是最后一次操作1之后进行的,没有被覆盖。否则说明都被覆盖了,清空addtag。
2025-07-04 10:36:28
347
原创 ABC277 贪心 分层图最短路 思维
贪心一个集合,上一次取的是x,下一步可以取x或x+1,问取完剩余和最小多少?规定m-1的下一个可以取m-1或0等价于问取走的最大值。这个取得条件相当于排序后取一段值连续的段,问最大和。直接贪心即可。但是有特殊情况,最大值的下一个是0,也就是排序后是个循环数组,考虑断环,原数组复制两倍拼起来,然后限制选择的一段长度最大为n。
2025-07-04 10:27:18
261
原创 ABC276 数论 bfs 线段树
数论给序列中每个数字除2、3(前提是可以整除),使得所有数字最终相等,问最终值最大是多少?最终值一定是每个元素的因子,所以一定是最小元素的因子,我们枚举最小元素的因子,然后检查整个序列能否通过除2,3得到这个因子,这样的因子有Olog2n,总复杂度Onlog3n另一个巧妙一点的方法是,这个最终元素如果存在,一定是gcd。因为假设有一个比gcd更大的答案,这个答案同时是所有数的因子,那么这个新的答案才是gcd,矛盾。反之,如果gcd不符合题意,就无解。
2025-07-04 10:16:17
886
1
原创 ABC287 贪心 字典树 树上背包
贪心?两个串匹配,要求可以随意替换其中的?,使得完全相等。从s里选一个前缀+一个后缀,与t长度相同,问能否与t匹配?对s所有长度的前缀回答这个问题前缀+后缀拼起来和t匹配,那么只要s前缀和t前缀匹配,s后缀和t后缀匹配就行了。预处理前后缀匹配,然后枚举前缀长度,前后缀分解即可注意到前缀匹配是单调性的,维护最长匹配前缀长度即可。
2025-07-03 23:29:52
912
原创 ABC286 背包dp floyd同时维护两个dp CRT 构造
dp第i种硬币ai个,面值bi,能否拼出x?直接dp,看成有ai个物品,体积都是bi。
2025-07-03 23:17:11
1193
原创 AB285 图论判环 dp 枚举 多tag线段树
拓扑排序判环n个人,每个人会让出一个id,想要获取一个新id,问能否有个操作顺序,让每个人都得到新id类似于OS里的思索检测,每个进程占用资源,需求资源,如果需求资源用箭头表示,形成环,就无解。判环可以拓扑排序。
2025-07-03 23:05:37
537
原创 ABC284 数论 dfs 字符串哈希
数论 millerRabin pollardRho给一个N8e18,找到p2qN显然枚举一个,然后判断另一个。但是直接枚举p/q都不对,枚举一个,想要取到所有情况,最好也是枚举p,然后枚举到1e9内所有质数。注意到minpq<=1e6,那么枚举minpq,或者说枚举1e6内的质数,然后分类讨论他是pq的情况。这需要我们快速检查另一半是不是质数。这可以用millerRabin,为了防止溢出最好快速幂用int128。
2025-07-03 22:50:52
824
原创 ABC275倍增思想 概率dp 子数组dp 前缀最值优化dp
倍增,记忆化注意到参数是倍增的,状态数不会很多,加个记忆化即可。范围很大,使用map记忆化。
2025-07-01 11:03:07
302
原创 ABC274 dp 旅行商问题 枚举 实数差分
dp每一步都要转90度,所以实际上只有奇数下标是在x上走的,偶数坐标是在y上走的,xy方向互不干扰,可以分开计算。对于一个方向,由于转90度有两个选择,每个元素都有加减两种选择,这类似枚举选哪个型dp,问最后能否拼出一个特定和,可行性dp即可。
2025-07-01 10:55:16
345
原创 ABC273 模拟 可持久化 区间DP
模拟 stl每次朝一个方向移动x步,有n个障碍,如果有障碍,会被长挡住。问执行m个指令后的结束位置?有障碍会被挡住,需要我们快速查找移动路径上是否有障碍,这可以set二分,找到大于当前位置的最小障碍/小于当前位置的最大障碍,然后看障碍位置是否在本次移动的路径上。这样需要对每一行维护所有障碍的y坐标,每一列维护所有障碍的x坐标。考虑到坐标范围很大,行列号也需要离散化,故考虑。
2025-07-01 10:37:16
765
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人