tricks 和注意事项
【数据删除】构造题!!!
杂项
- 多测未清空
- 没开
long long
- 如果正面处理不方便,可以考虑拆单个的贡献然后用差分
- 跳来跳去的或要操作很多次的考虑倍增
- 判断等比数列时考虑正负性,并用比例的性质来判断公比是否相同
- 小心
double
的精度误差 - 明确数组的定义,避免开小 RE
- 对于求解回文串的题目,可以考虑异或
- 遇到一些范围很小的东西且存在两种不同的状态时可以考虑二进制状压
- 能尽量使用低维数组就尽量用(题目同上)
- 随机摆放的题目其实判断合法只需要判断个数(题目)
- 多测一定要等输入完后再
return
!!!!!!!!! - 在使用二分之前一定要证明单调性
- 多次询问且不带修,何不离线?
- 单峰直接三分即可(题目)
思维题
- 考虑探寻规律(正向可以,反向也可以)(题目)
- 可以通过前缀和来快速计算区间的贡献(题目)
- 在判断 \(x\) 是否为中位数时可以将 \(\ge x\) 的数赋值为 \(1\),将 \(\le x\) 的数赋值为 \(-1\),最后判断 sum 是否 \(\ge 0\) 即可(题目)
- 考虑状态压缩,转换成二进制(题目)
- 分治,对于小范围的询问可以直接预处理,而大范围的考虑在什么情况下会变成小范围的(题目)
- 二维平面直角坐标系上的题可以考虑将 \(x\)、\(y\) 坐标分开考虑(题目)
- 奇偶性相关可考虑黑白染色(题目)
- \(\min(a, b)=\frac{a+b}{2}-\frac{|a-b|}{2}\)(题目)
- 对于合法括号串的判定,可以和判断中位数一样(题目)
- 注意对题意的转化,这通常会有很大的作用(题目)
贪心系列
- 对于线段覆盖问题,考虑按右端点排序
- 如果数据范围十分大,不好 dp,那考虑反悔贪心。一种常见的方法是采用堆进行优化。
dp 系列
文章
- 状态和转移不够明确,导致贡献计算不到位
- 如果发现原问题的逆问题可以使用 dp 解决,不妨先推一下逆问题 dp 的式子,然后逆向思维反推出原问题的方程(题目)
- 转移需要前缀的话可以考虑树状数组优化(题目)
- 填表计数问题可以考虑用一维表示前 \(i\) 行,大概率不用把列存进状态里(题目1、题目2)
- 如果题目要求可行性,可以考虑 dp(题目)
- 如果涉及到每长度为 \(L\) 的子串都模 \(m\) 同余,那么必然有结论每个 \(a_{i\bmod m}\) 都相等。此时直接 dp 即可(题目1,题目2)
- 类似于过河卒的 dp 问题,可以考虑记录一下是从列转移的还是从行转移的(题目)
- 拆转移方程里的绝对值可以按从小到大或从大到小的顺序进行转移(题目)
图论系列
- 使用
queue
还是prioirty_queue
要分清 - 松弛的式子推对了吗
- 拆点,对每个点都创一个超级源点(题目)
- 考虑建超级源点以及虚点
- 在 bfs 时可以在入队前判断是否找到答案,这样可以省去很多冗余的操作,减少时间(题目)
- 遇到和环有关的问题,可能是生成树(题目)
- 遇到多次询问判断两点能否到达题目,如果不带修,考虑离线排序然后双指针加并查集(题目)
- 发现题目中有类似“很多天”的描述,可以考虑类似分层图的思想(题目)
树论系列
- 关于树上的链的问题,想一下能否长链剖分(题目)
- 可以考虑维护从 \(u\) 到根的信息,然后直接异或合并(由异或的性质得)
- 感觉像树形 dp 但又不好做的或树上查询但离线的可以考虑 dsu on tree(题目,上一个同)
- 基环树上的问题可以考虑把唯一的环断开然后转成树上问题。不过把环拆成树的那条边的两个端点都要进行操作(题目)
- 有 \(n\) 个节点的无根树,一共有 \(n^{n-2}\) 中构造方案(题目)
- 树上路径问题需要想到树的直径(题目)
数论系列
- 发现要求的数的范围很大比如 \(n\le 10^{12}\) 时,想一想是不是可以用整除分块根号过(题目)
- 区间内最远互质点对可以直接枚举(题目)
- 上指标求和:\(\sum_{k=r}^{n}C^r_k=C_{n+1}^{r+1}\)(题目)
字符串系列
- 其实我们是可以在 \(O(n)\) 的时间内判断能否通过删除一些数使原串变成回文串的(题目)
- 在进行解题之前其实可以把两边合法的字符串先去掉(题目)