做题相关

  1. 区间问题。

    如果要求 l[L,R],r[L,R] 并且答案可以预处理的话,将其抽象为二维平面。令 (l,r) 表示 [L,R] 的答案,答案为 (L,L),(R,R) 这个矩阵的答案。

    去做二维前缀和即可。

  2. 对于题目中明显给出很小的限制时,不妨考虑将该限制作为 dp 的一维,将原先想到的 dp 但某一维较大作为 dp 的值。

  3. 碰到动态问题时,可以试试按时间作为权值。

  4. 如果 iai=m,则 ai 的种类至多 m 种。 T1

  5. 对于最值问题,一种思路是可以通过转为判定问题,即能否大于等于/小于等于,然后是可二分的,就可以做了。

  6. 最大值最小/最小值最大往往用二分。

  7. 如果贪心只能取得局部正确性的话,需要悔贪。但是要带只优先队列的 log

  8. 如果判定一个集合中元素的出现次数的相关性质(e.g. 一个整数集是否组成排列,连续段,等差数列等),或元素集,元素集间的相关性质,可以使用 Xor-Hashing

    传。

  9. 根号分治

  10. 有单调性可以考虑二分。

  11. 跟时间相关的题目可以尝试离线后排序去做。

  12. 区间染色问题如果左右端点很大的话可以考虑先把端点坐标离散化。

    但是这会有一个问题,原本不连续的坐标因为离散化后变得连续了。

    所以可以将不连续的端点之间插入空点。

    例如 P3740 贴海报 P9166 火车站

  13. 如果我们要在一张图中做单元最短路:

    (1) 如果这张图的边权均为 1,用 bfs 可做到 O(n)

    (2) 如果这张图的边权仅为 01,用 01bfs 可做到 O(n)

    具体实现就是考虑 dij 的做法,我们可以用一个双端队列代替掉优先队列,每次插入节点时如果边权为 0 的话就放在队首,否则放在队尾。

    显然这样是满足优先队列的性质的,并且能去掉插入、查询和删除的 log

  14. 在一段区间内加上某个数列,可以考虑将这个数列进行多次差分成为常数列。

    P1438 无聊的数列

    CF407C Curious Array

  15. 求满足什么条件的区间数量,不妨考虑枚举左端点,然后右端点向右移动,尝试是否能够在 O(1) 的时间复杂度内从判断新的 [l,r] 是否满足条件。

    写出来后,尝试能否用类似的方法将区间转化为前缀,做到更低的时间复杂度。

  16. 求区间内满足某一条件的二元组/三元组/四元组/...(长度给定且确定)的数量,可以尝试将其拆分,然后用线段树维护每一个部分。

    P6373 IOI计数

  17. gcd{a1,a2,a3,...,an}gcd{a1,a2,a3,...,an+1}

    lcm{a1,a2,a3,...,an}lcm{a1,a2,a3,...,an+1}

    根据这个性质,区间 gcd/lcm 可以尝试使用二分。

    CF359D Pair of Numbers

    CF475D CGCDSSQ

  18. 线段树最小点覆盖可以先把需要覆盖的值升序排序,然后在 update 的开头加一句 if(t[k].val<=num) return ;,这样能快很多,道理显然。

拜谢 xgf 大神。

posted @   osfly  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示