-
状态转移问题,一个状态的改变还会牵涉到此状态之前的状态时,很难利用简单的动态规划解决,可以考虑利用dijkstra跑最短路(最好不要用bfs,可能会t得很惨),把更新过的状态存进队列中,队列空时停止 (注意:如果是bfs的话,实际上找到答案就可以停止了!否则会爆栈!)
例题:
2024牛客寒假集训2D-Tokitsukaze and Slash Draw
ATC-abc340D-Super Takahashi Bros.
2023ICPC沈阳E-Sheep Eat Wolves -
根号分治,适用于预处理可以简化大数据计算,但是不能进行太多组预处理的情况,小数据直接暴力计算,大数据使用技巧计算
例题:CF-1921F-Sum of Progression -
多重哈希,由于只进行一次取模可能会出现相同的关键字,于是可以进行多次取模,取多个模数,尽量避免相同关键字
例题:ATC-abc339G-Smaller Sum -
需要分析不同的状态组合,且状态不多时考虑状压dp
例题:ATC-abc338F-Negative Traveling Salesman -
试毒题的一般模板:利用二进制考虑,找到毒品我们得确定毒品的编号在它的二进制表示中,哪些位是1哪些位是0,每一个试毒者的作用就是判断某一位是否为1
例题:ATC-abc337E-Bad Juice -
判断相对顺序可以考虑转化为图论的判环问题,使用拓扑排序解决
例题:CF-1931F-Chat Screenshots -
在环上求弦的交点时可以把环的一条边隔开,拉成一条直线,然后弦就变成了曲线,我们可以通过判断曲线是否有交点来看弦是否有交点,怎么看曲线有没有交点呢,就是关注左右两端点,没有交点的话,左右端点一定是成对出现的,意思是比如说 l1 l2 r1 r2是不合法的一组,所以可以利用栈来判断,左端点就存进去,右端点弹出栈顶,看是不是匹配的左端点,不是就有交点
例题:ATC-abc338E-Chords -
带有一定条件的区间求和不要盲目考虑前缀和,发现前缀和不可做时要尽快往树状数组、线段树上面考虑
例题:2024牛客寒假集训4H-数三角形(hard) -
将所有需要得到整数的
log2()
全部换成__lg()
,防止精度损失
例题:CF-1922E-Increasing Subsequences -
两个数模上同一个数m的余数相同,那么这两个数的差值一定是m的倍数
例题:CF-1920C-Partitioning the Array -
两个数 x 和 y ( 0 <= x <= y <= c ),如果 x + y = k,那么 x 和 y 有
k / 2 + 1
种取值方式;如果 x - y = k,那么 x 和 y 有c - k + 1
种取值方式
例题:CF-1935D-Exam in MAC -
不需要最小化代价的问题,都不可以转化成最短路来做
例题:CF-1935C-Messenger in MAC -
关于位运算的查询问题,可以考虑把每个数的二进制序列存到字典树里方便判断
例题:CF-706D-Vasiliy’s Multiset -
以树上不同的结点为根答案不同,一次dfs只能得到一个结点为根时的答案,这种题目需要用换根dp
换根dp的基本步骤是:
– 首先任取一个点为根,dfs一遍得到以该点为根时的答案
– 再跑一遍dfs,考虑将当前根的邻接点换为根时的情况,并修改相关点的状态
例题:CF-1324F-Maximum White Subtree -
一个无向图中,所有点对之间的最短路径经过边,令 u 为父结点,v 为子结点,u-v这条边会被经过
size[v] * (n - size[v])
次(把 u-v 断开,u所在集合的点到v所在集合的点需要经过 u-v)
例题:CF-1401D-Maximum Distributed Tree -
质数是密集的,每300个数就一定会出现质数
例题:CF-584D-Dima and Lisa -
判断一个数组中每个数的前面/后面有多少数字比当前大/小,用线段树
例题:CF-61E-Enemy is weak -
判断无向图的连通分量变成强连通分量需要删掉哪些边,可以用并查集,每加一条边就合并,如果发现这两个顶点已经在一个并查集里,说明现在加的这条边是多余的,记录一下即可
例题:CF-25D-Roads not only in Berland -
在树中,如果结点 v 的 dfs 序
dfn[v]
处于[dfn[u], dfn[u] + sz[u] - 1]
,则说明 v 在 u 的子树中
例题:CF-1328E-Tree Queries -
一个合数,一直除以它最小的素因子,直到不能除为止,这个素因子和剩下的数必然互质
例题:CF-1366D-Two Divisors -
两个数相乘末尾0的个数等于
min(cnt[2], cnt[5])
,cnt为两个数中的因子个数
例题:CF-2B-The least round way -
计算每个点的最短路条数:在dijkstra更新最短路的时候,同时更新该点最短路的入度
例题:CF-449B-Jzzhu and Cities -
BFS / dijkstra 能更新的不仅仅有最短路,还可以更新最佳状态
例题:ATC-abc348D-Medicines on Grid -
枚举类复杂度过高时可以考虑bitset,时间复杂度会除以64
例题:ATC-abc348F-Oddly Similar -
位运算将所有类似于
(1 << i)
换成((i64)1 << i)
防爆
例题:ATC-abc347D-Popcount and XOR -
处理矩阵问题的经典思路:二部图,将点化为边,将行号和列号分别看做点,如果 ( i , j ) (i,\ j) (i, j) 处有一个点,就理解为有一条由 i i i 指向 j j j 的边,可以通过这个将原问题转化为点的连通性问题
例题:ATC-abc131F-Must Be Rectangular! -
一种类似二分图匹配方案数量的trick:将所有待匹配的物品进行染色,取数量最少的颜色个数即为方案数
例题:CF-1427D-Unshuffling a Deck -
如果 ∑ i = 0 n a i = n \sum_{i=0}^{n}{a_i}=n ∑i=0nai=n,那么 a i a_i ai 的种数不会超过 n \sqrt{n} n
例题:牛客小白月赛97F-parent 树上启发式合并 -
1 e 6 1e6 1e6 以下的数的因子种类个数不会超过10个(因为 1 × 2 × ⋯ × 10 > 1 e 6 1\times 2 \times \dots \times 10>1e6 1×2×⋯×10>1e6),一个trick可以记住
例题:CF-920F-SUM and REPLACE -
取模运算当模数为 2 的次方时,可以将
a % mod
换成a & (mod - 1)
减小常数
例题:24牛客多校D-XOR of Suffix Sums -
将一组数分成不同集合,同一集合内单调不减,求划分方式的问题,可以转化成,求最长下降子序列
例题:CF-1296E2-String Coloring (hard version) -
大于 2 2 2 的数可以用 1 1 1 和 2 2 2 拼起来,大于 3 3 3 的数可以用 3 3 3 和 2 2 2 拼起来,这种思想经常出现
例题:CF-1616D-Keep the Average High -
不要再用
sqrt
了,一定会出精度问题,实在要用根号就换成sqrtl
,把所有double
都换成long double
例题:2024湖北省赛B-Nana Likes Polygons
水题中的稀奇古怪trick合集
于 2024-02-06 13:44:40 首次发布