记录
CF1556F Sports Betting
DP、正难则反
首先很明显可以转化为求每个点的获胜概率。
直接考虑获胜的情况,发现由于获胜具有传递性,一个点的全局获胜情况可以会有其他点的局部获胜情况转移得来。
由于每个点有一个权值
点之间的转移是由于“获胜具有传递性”导致的,考虑取其反命题,可以发现"不获胜"不具有传递性,甚至必须同时满足,所以再从不获胜的角度考虑。
全部获胜的概率应该等于
剩下就与题解一样了。
所以我认为,“正难则反”其实是因为“正”的时候所满足的一些性质不好处理,而“反”所满足的一些性质截然不同,可能就易于处理了。
CF1734F Zeros and Ones
数位DP,构造不可求类型
很容易转化到这个式子
如果直接寻找
注意到所有的操作只与数码而不与真实的值有关,并且是计算一段区间的答案,可以考虑数位DP。
有一个式子:
在处理“构造不可求类型”的题目时,应该尝试将询问转化成另外一个式子。
AGC013E Placing Squares
矩阵快速幂优化DP
很明显这是一道DP题,且需要在连续的非标记段使用矩阵快速幂优化DP。
直接考虑令
最朴素的想法是,将
光是
由于找转移是找相邻元素的关系,我们应该使用“2024.7.11T2”的方法,整体代换成前一项。
我们发现用整体代换的方式去掉的平方,接下来令
可以线性转移
还有一种方法:赋予组合意义,寻求新的解法。
在这里就是“在上面放一个黑球和一个白球的方案数为
AGC030D Inversion Sum
计数、概率DP
因为一种情况改变的逆序对太多,只想到了
由于这是关心“所有情况的总和”,然而操作对整体的变化太过于复杂,于是转化为局部的考虑。
这里根据期望的定义,化“所有情况的的总和”为逆序对的“期望”乘上方案数,又根据期望的线性,那么转化为求
启示是:求“所有情况的总和"等价于求期望乘上总方案数,就可以利用线性拆贡献。
P4655 Building Bridges
斜率优化DP,动态背包
李超线段树可以通过维护取min后的折线,从而代替线段树维护凸包解决斜率优化DP
CF1194G Another Meme Problem
数位DP
首先一眼数位DP。
但是数位DP是不关心具体数值的,但这道题很明显要关注具体数值。
于是考虑枚举数值大小,易得最终合法的分数值很少,假设最简形式为
如果题目一个点不满足算法前提,可以考虑枚举他
P4590 游园会
状压DP,DP套DP
一个朴素的想法是令
于是想怎么可以在LCM之间转移。
我们知道有一种DP的转移方法:
也就是说,只要我们记录
但是
在
P3349 小星星
计数,反演
首先肯定是在树上考虑更简单。
令
既然限制是必须的,就想能不能通过别的方法代替“通过状态进行”的限制。
利用容斥,转化限制,当有一个较好的全局限制的时候,就可以避免在DP状态中存入过多的信息 。
我们发现“恰好”映射不好做,于是考虑计算“至多”映射,再通过子集反演就可求得
BZOJ4671 异或图
反演
结果恰为
令
为什么系数是一个斯特林数呢?因为对于一个恰好有
根据反演最后的答案为 :
接下来就是考虑如何求出
由于
这是经典的线性基的问题,假如线性基里有 x 个数,答案就是
时间复杂度
CF622F The Sum of the k-th Powers
多项式,拉格朗日插值,线性筛
易得原式是一个
可以发现复杂度的瓶颈在预处理
注意到
找到函数的积性往往可以借助线性筛加速预处理
CF995C Leaving the Bar
归纳、贪心
有一个贪心的思路:
每次随便选取两个向量
但这样很明显是假的,Hack如下。
3
1000000 0
0 999999
600000 -600000
他的原理是一开始放两个无论如何处理后模长度都很大的向量,让你最后只能爆掉。
乱搞!
为了避免使得两个很大的向量放在一起,可以不断random_shuffle
,直到得到正确的结果。然后就过了。
根据归纳的思路,在减小规模的同时不能改变其他的限制,而上述方法却改变的值域的上限。
其实改成一次取三个向量就行了,因为对于任意三个向量,一定会存在两个向量所在直线的夹角小于
P5298 Minimax
线段树合并
令
复杂度
其实合并的时候不一定需要
if(!lt||!rt)return lt|rt;
在这道题中,if(!lt&&rt)
说明 if(!rt&<)
说明
并且递归的时候可以记录左右儿子信息,便于转移。
P8511 TEST_68
将树转到序列上,对于每个点的答案就是总序列除去中间一段后的两端区间中的最大两数异或。
考虑建可持久化01字典树,但似乎并没有什么好用的处理跨越中间一段的做法。
复杂度
发现字典树上的操作是以一个与节点数相关的复杂度插入删除的,于是有一个树上启发式合并的做法:每次先把轻儿子和自己全扔进 trie 然后 DFS 重儿子并保留,接下来遇到一个轻儿子先从 trie 里面删掉这个子树再 DFS 进去,再加回 trie 树,继续 DFS 别的轻儿子。复杂度
考虑全局最值取到的两个点
样例不只用来检测你的程序,有时看一看样例(比如这道题,一堆都是
最值得到方案又是也是一个关键,特别是全局的最值方案,往往以这个为突破口,可以简化条件。
如果单次询问可能降到更优了,那一定是因为许多答案都是重复的。
P3242 接水果
扫描线,整体二分、链覆盖问题
首先可以转化为一个二位数点问题,然而这里是求第k小,我并没有什么扫描线的方法,所以这里可以使用线段树套线段树套平衡树的方法解决,复杂度
如果每次二分一个
但我写了半个下午才想起来整体二分单次处理不能有设计复杂度的全局变量,只能重构了。
但我又写了半下午没过样例才发现写代码的时候记错题了 QWQ。只能重构了。但有这样一点:
-
一条路径包含多少条路径⇔对应点被多少个矩形覆盖
-
一条路径被多少条路径包含⇔对应矩阵被多少个点覆盖
P2056 捉迷藏
括号序列,先咕一下。
P8253 如何正确地排序
先咕一下。
P5304 旅行者
最短路,二进制划分(不是二进制分组)
本题是要求一个两两之间最短路的最短路,通过建立超级源点的方式可以将求多源最短路化为单源最短路(因为不关心两两间的具体信息)。
然而为了避免从自己走到自己的情况,应该使图划分为两个部分,只计算部分之间的答案。
这就要求任意两个关键点都要分属两边过。
那么对于
原理是,假设
其实还有种方法是随机划分成两部分,一次得到最优解的概率是
假设关键点a到关键点b的最短路径最短,那么当关键点a被分到从源点连边的一半,关键点b被分到向汇点连边的一半时,能够取到最优解,所以概率为1/4。(注意图是有向的)
随机
好像还有好几种做法,可以后面研究一下。
ABC077D Small Multiple
同余最短路
“如果你要写风,就不能只写风。你要写柳条轻轻柔柔飘入你心中。”
这道题也是,虽说求的是
因为这是一道数码题,我们要看数值的变化对数码变化的影响。
不考虑进位,那么一个数个位加一,会导致值加一并答案加一。
对于进位,我们可以直接乘十,答案不变。
可以发现从
由于答案自变量集合取于
既然是数码问题,就应该也有数位 DP 做法。
假设位数是有限的,考虑一个不断加数码的过程,设
枚举
当然这是有问题的,因为
由于是去最值,一次重复更新没有关系,所以方程可以改为:
这就可以适用于无限的情况。然而这需要解方程。
但我们知道
P4926 倍杀测量者
差分约束
一个Grimgod告诉我的方法:如果贡献以乘积形式累计,可以通过取对数转化为加减
P5905 【模板】全源最短路
太巧妙了。
将
关键在于,新增的权值与走的路径没有关系,一条路径就是一个连续的状态变化,设计给每个点赋一个权值,并以差放入答案, 利用叠进和相消,最后就只与初始两种状态有关了。
给每个点赋权值,施以变化累积之相逆变换之正变换,以抵消中间过程,我称其为“势能法”。如果状态变化是通过异或累积,那么
P7515 矩阵游戏
差分约束、调整法
P3749 寿司餐厅
最小割,最大权闭合子图
当我们连边
当
P4249 剪刀石头布
网络流,结构解析化
竞赛图三元环的数量为
证明:考虑
差分建图即可。
差分建图:用于处理平方,且希望求最小。
P4843 清理雪道
上下界最小流
建图方式:每条边必须流过一次,即下界。
xht算法:类似有源汇上下界可行流的构图方法,但先不添加
不仅关心网络流的结果,更关心其过程与状态。
Tree MST
最小生成树
有个技巧:
- 对于完全图
,将 分成 )。对每个边集求 最小生成森林,得到新边集 ,再求 MST。最终剩下的边集,等同于原边集的 MST。
此法可减小边的规模。
我们可以点分治,考虑跨越重心的路径所生成的边集。
以分治中心为根,令
我们只需保留p最小的一个点,然后把其他点都和他相连,显然就是MST
了。
这里会产生子树内自己连的路径,但是比直接连劣所以不会影响答案。
点分治一共会产生kruskal
就
P8078 秃子酋长
回滚莫队
回滚莫队不一定处理无法删除/插入的情况,也可以用于只插入/删除可以减小复杂度的情况。
这题很容易想到以平衡树实现
发现如果只有删除的话,可以用链表
P8421 rsraogps
扫描线(子区间权值和问题),增量法,势能法
首先这是一个子区间权值和问题,套路扫描线,其实本质就是在看增量贡献,即添加一个元素时,答案如何变化。
扫描
考虑增量贡献,即
令
先考虑不变的时候如何继承。那么在
每次扩展暴力找那个不发生变化的位置,根据势能的思路,复杂度
其实势能就是变化的“机会”,操作的增多带来未来操作机会的减少,从而使得一些暴力的复杂度正确。
P5292 校园旅行
DP,删除无意义信息(生成树删边)
首先不难想到一个
因为总状态数只有 continue
)。转成DFS会WA(但我还不知道为什么,求助帖),考虑如何减少边数!!(一般使用生成树)
我们将所有转移分成两类:向相同编号的点转移(同色边),向不同编号的点转移(异色边)。
对于同色边。如果这些边构成的连通块(同色连通块)是个二分图,那么只保留一颗生成树是等价的,因为边可以来回走,所以一同色边可以选择来回走来等待另一个点的到达。因为在一条边来回走不能改变颜色长度的奇偶性,二分图也是,所以是等价的。
如果不是二分图,说明可以改变的奇偶性,加一条自环即可。
对于异色边。其异色连通块一定是一个二分图,其左右点颜色不同,此时直接生成一棵树一定是对的。
于是通过两次生成树,将边数缩小至
复杂度
P5363 移动金币
博弈论,计数DP
可以发现这是一个变相的阶梯NIM,满足:
于是设
注意到两点:
-
变量是等价的,所以可以直接用组合数解决,不必要以
的复杂度枚举解决。 -
考虑不为
的,可以是总数减去为 的,这在 NIM 相关的组合数问题中常见。
因为异或和为
设
P3642 烟火表演
slope trick
以这道题为例探讨一般情况下 slope trick 做题思路。
列出方程
找到一个朴素的 DP 方程,并使得这个转移是一个状态被包含进绝对值。
这个函数一定形如下图:
本题中,令
拆绝对值
以函数斜率为零的最低段
入手,把绝对值拆成分段函数的形式,并直接确定函数的取值位置。
考虑从一个节点到父亲节点的转移。
-
当
的时候,由于移动 会使 增加 (斜率 ),而 无论如何增加的值 。所以 取到最小值, 。 -
当
的时候,根据上文的分析,一定是 的时候取到最小值,于是考虑后面的权值如何取到最小。很明显我们想让 即 。-
当
即 的时候,有 -
当
即 的时候, ,我们想让值最小,就要让 尽量小,所以 。 -
当
即 的时候, ,同理要让 尽量大,所以 。
-
综上所述:
合并函数
函数直接相加,可以直接将端点合并,不去重,注意维护新的
。
直接暴力的用 multiset
都可以,但一般情况下只需要用可并堆,因为我们并不想要随机访问,一般是从左到右或从右到左顺序遍历。
维护端点
根据得到的分段函数,维护斜率变化位置的横坐标,相邻段变化为
。
首先要得到
但这里不用,观察性质,每一个处理的函数
计算答案
从
算起,往右边走。
假设第
对于本题,
P5445 路灯
树套树(二维数点),费用提前计算
首先可以注意到每次的
可以费用提前计算!
假设一个矩形在
P5336 成绩单
区间DP
很明显是一个区间DP,于是设
既然不能同时取,那就分别处理,先合并,再计算贡献,有以下转移:
复杂度
可以按照右端点的情况讨论:
-
已产生贡献: -
未产生贡献: -
这次产生贡献:
复杂度
如何第二条转移的计算复杂度:,有
其实第二条转移可以直接用刷表法简单转移:
原因是最值操作不可逆,刷表法是顺向操作,自然更符合。
P4563 守卫
区间DP
首先注意到对于每个区间,右端点是必选的。
记
我们可以更改枚举顺序,每次固定
复杂度
P2481 代码拍卖会
DP,拆分贡献
有一个朴素 DP:
将转移看作
复杂度
发现转移的问题在于,我们不得不从左往右处理并记录上一位选择了什么,来限制这一位的转移,即数位的选择相互牵制,如果可以将贡献拆开,化为简单的情况,就可处理了(就像《成绩单》那道题,拆为选完与没选完两种)。
注意到对于任何一个方案,都可以看做 9 个以内的若干 “1 的后缀”相加而成!如下图:
于是我们只需要随便找九种并起来就好了,这样就没有了选择的限制。
考虑将
接着做一个背包就好了。设
有转移方程:
复杂度
P5385 须臾幻境
主席树,LCT
准备型离线(假离线):强制在线时,也可使用离线算法进行预处理,并并记录离线处理时的各个状态(本题是主席树),此时不是直接得到答案,而是为快速得到答案做准备。
其实点分树也是一种假离线,但莫队就不要想了。
如果可以离线,那么有
在不预处理的情况下,易得单次询问的时间复杂度不可能低于
那么如何预处理呢?考虑假扫描线。
每次从右往左扫
因为连通块的个数
P5979 Druzyny
CDQ优化DP
使用场景:DP转移不连续,考虑贡献。
过程:利用分治,考虑
,考虑 与 。即分开考虑。 过程:
重点在中间
不难得到一个朴素的 DP 方程:
考虑每个
考虑如何求出
需要同时满足。
第二个条件直接线段树维护,第一个条件可以使用类似扫描线的方法解决,即动态加入删除。
于是做到了复杂度
P7914 括号序列
区间DP
直接把所有情况列出来
-
****
-
(...)
-
(...)...(...)
-
***(...)...(...)
-
(...)...(...)***
区间 DP 转移即可。
P3592 MYJ
区间DP
CDQ 与区间 DP
划分区间使得独立的问题不仅可以使用 CDQ,而且可以使用区间 DP
其中 CDQ 分治是考虑两侧元素之间的点对点贡献
而区间DP是只关心整体值
但他们使用前提相同——区间可划分 。
这道题想到了 CDQ 就应该也往区间 DP 想一想。
P10656 学习轨迹
扫描线,最值确界法
首先有一个暴力,如果枚举 set
维护,复杂度
因为是求最大值,可以尝试对答案估计下界,发现答案一定不会小于
联系到上面的暴力算法,我们发现根本不需要用链表维护整个序列的选取情况,而仅仅只需要关心
于是将暴力算法改进为,对
复杂度
注意:线段树的区间修改的下传标记必须要使用一个
P10208 礼物交换
广义前驱后继:满足条件的元素中编号之左右最邻近点,以确定包含自己的区间中的其他点是否有满足条件的。就是将关心所有点变为关心最有可能满足条件的那个点
临界点思想:从关心所有点变为关心最容易使得条件成立或不成立的那个点。
比如这个“广义前驱后继”和
的方法 条件转化从简思想:区间中满足条件A的可以
满足条件A中属于区间的 同时满足条件AB
满足条件A中满足条件B的 满足条件B中满足条件A的
不难发现,组合是可行的当且仅当
讲条件转化为
但第二个条件似乎没有第一个条件“简洁”。其实,将每一个元素看作区间
那么条件一转化为:
即
这个用树状数组解决,复杂度
还有一种暴力:
如果
不难看出一个将序列按照
这个方法也可以用同样的方法用广义前驱后继优化到
P10207 马拉松比赛 2
区间DP,DP剪枝,诈骗题
为了不负重折返跑,易得对于一个
发现无论如何,
发现在不断捡起的过程中区间的状态发生变化,于是考虑使用 DP 转移。
对
边界:
复杂度
复杂度肯定过不了了,考虑剪枝。
假如对序列去重后有
P4755 Beautiful Pair
CDQ 分治
尽量将关心的内容降到最少
因为是所有对数,并且一对关心的还是一个区间,所以考虑过扫描线,但是由于加上了
看似是关心一个区间,其实只关心区间内的最大值,当区间的最大值确定的时候,两边相互的限制就简单了。
并且这又是一个关心两两组合的问题,可以考虑 CDQ 分治。
每次找到一个区间的最大值,递归两边,并是两边分别有序,最后 upper_bound
进行查找就行。
复杂度
注意事项:在不完全二分中(即不是从中间剖开),
P4707 重返现世
容斥
首先根据 k-min-max 容斥,令
重点在如何计算这个容斥式子。
考虑增量法,即新添加一个
设
考虑另一条路,即递推式,有
可以发现整个变化只与
于是设
关于边界,有结论:
证明:要考虑
本体可解的一个很大原因是
找到转移的统一性。
P9910 Dizalo
树状数组
研究生效时间
组合意义与表达式的转化
不难分析出,答案为对于所有后缀最小值的位置,前面比其大的数的个数之和,利用单调栈,可以做到
首先考虑一个值什么时候成为后缀最小值,我们发现,只有当它后面比它小的数全部删除,并且自己没有被删除的时候,它是后缀最小值,于是我们发现一个值是后缀最小值的时间是一个区间!(研究生效时间!)
假设此时后缀最小值的集合为
这是一个二维数点问题,可以用数套树
因为
尝试过单侧递归线段树,失败了,表现为无法与权值修改相结合,本质是没有对题目的性质进行进一步挖掘,改进方法为多角度的考虑问题,在多种性质间转化。
P10137 Walking in Manhattan G
倍增
只看结果,不问过程:如果变化的过程很复杂,那么尝试直接枚举+判定结果。
因为交点有
需要发现一个性质,时间其实可以转化为线的奇偶性,如果线条的奇偶性相同,则不换方向,否则一定换方向。
并且换了方向后一定是一上一右交替,于是可以将奇偶性相同的线看作一段,我们枚举一上一右交替次数进行判定,这样就没必要知道到底经过了那些位置,直接可以处理出最终到哪里。发现这个枚举可以用倍增代替,复杂度
P10138 Cowmpetency G
首先发现线段不能完全重叠,然后剩下没什么难的。
可以考虑化为形式化语言,进行思考。
P10191 Test Tubes S
应该先找到结束情况
-
两个烧杯中各有一互异颜色(此时不用再倒向烧杯)
-
有一只没有颜色。
容易发现烧杯中只能放一种颜色,直接枚举放哪种,避免讨论。
然后模拟整个过程,需要注意当试管顶元素相同的时候,因为最后要减成各只有不超过一个颜色,所以应该是颜色多的向颜色少的倾倒。
P1052 过河
因为根据
还有一个想法是矩阵加速。
因为一个
P2051 中国象棋
计数DP
一切无标号的东西都不用状压,而是计数,即等价不区分。
首先很容易想到一个状压的做法,但是列是无标号等价的,所以直接记录有列选了
P2516 最长公共子序列
计数DP
小容斥,直接剪掉不合法
发现算重只会在
P9871 天天爱打卡
离散化
离散化的值是需要的值,而不一定是真正存储的值。比如这道题,将l-1
离散化,因为这是“需要的值”,一定要想清楚。
作者:lupengheyyds
出处:https://www.cnblogs.com/lupengheyyds/p/18347517
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】