做题相关
-
区间问题。
如果要求
并且答案可以预处理的话,将其抽象为二维平面。令 表示 的答案,答案为 这个矩阵的答案。去做二维前缀和即可。
-
对于题目中明显给出很小的限制时,不妨考虑将该限制作为 dp 的一维,将原先想到的 dp 但某一维较大作为 dp 的值。
-
碰到动态问题时,可以试试按时间作为权值。
-
如果
,则 的种类至多 种。 T1 -
对于最值问题,一种思路是可以通过转为判定问题,即能否大于等于/小于等于,然后是可二分的,就可以做了。
-
最大值最小/最小值最大往往用二分。
-
如果贪心只能取得局部正确性的话,需要悔贪。但是要带只优先队列的
。 -
如果判定一个集合中元素的出现次数的相关性质(e.g. 一个整数集是否组成排列,连续段,等差数列等),或元素集,元素集间的相关性质,可以使用
Xor-Hashing
。 -
有单调性可以考虑二分。
-
跟时间相关的题目可以尝试离线后排序去做。
-
区间染色问题如果左右端点很大的话可以考虑先把端点坐标离散化。
但是这会有一个问题,原本不连续的坐标因为离散化后变得连续了。
所以可以将不连续的端点之间插入空点。
-
如果我们要在一张图中做单元最短路:
(1) 如果这张图的边权均为
,用bfs
可做到 。(2) 如果这张图的边权仅为
或 ,用01bfs
可做到 。具体实现就是考虑
dij
的做法,我们可以用一个双端队列代替掉优先队列,每次插入节点时如果边权为 的话就放在队首,否则放在队尾。显然这样是满足优先队列的性质的,并且能去掉插入、查询和删除的
log
。 -
在一段区间内加上某个数列,可以考虑将这个数列进行多次差分成为常数列。
-
求满足什么条件的区间数量,不妨考虑枚举左端点,然后右端点向右移动,尝试是否能够在
的时间复杂度内从判断新的 是否满足条件。写出来后,尝试能否用类似的方法将区间转化为前缀,做到更低的时间复杂度。
-
求区间内满足某一条件的二元组/三元组/四元组/...(长度给定且确定)的数量,可以尝试将其拆分,然后用线段树维护每一个部分。
-
。 。根据这个性质,区间
可以尝试使用二分。 -
线段树最小点覆盖可以先把需要覆盖的值升序排序,然后在
update
的开头加一句if(t[k].val<=num) return ;
,这样能快很多,道理显然。
拜谢 xgf 大神。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?