水题中的稀奇古怪trick合集

  • 状态转移问题,一个状态的改变还会牵涉到此状态之前的状态时,很难利用简单的动态规划解决,可以考虑利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Texcavator

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值