警钟长鸣
就是一些小技巧。也可以说是警钟。
sort函数排序不具有稳定性。- 不开
long long见祖宗。 - 特殊情况下,开了
#define int long long见祖宗。 memset见祖宗。- 大量输入建议使用快读。
- 线段树维护区间最小值区间覆盖
lazy的初始值要赋成INF。 - \(C_n^m\) 在满足 \(n\ \&\ m=m\) 的位运算关系时,值为奇数,否则为偶数。
- 一个代码中,有多个队列或者多个栈时,不要把他们搞混了。
vector就算不往里面存数也会占很多空间。- 用
long long做二进制时,要写成1ll << x。 - 当线段树同时维护区间加和区间乘时,下放标记时应先下放乘法标记再下放加法标记。
- 写 FHQ 时注意若该节点没有左右儿子,谨慎进行
pushdown和pushup。目的是不要给 0 节点加上奇奇怪怪的东西。 - 使用快读是应注意题目输入中是否存在负数。
- 写离散化的时候
lower_bound时记得使用unique后的序列长度。 multiset常数过大可尝试使用可删堆代替。#define慎用,(x)一定要带括号。比如#define S(x) (x * x)可能错误,应写为#define S(x) ((x) * (x))。- 把区间加离线下来做差分,这种情况记得开二倍空间。
- 据 UKE_Automation 获悉,一个排列,交换,这些关键词出现考虑逆序对。
- 莫队可以采用奇偶性优化:
struct nodeq {
int l, r, id;
bool operator < (const nodeq & cmp) const {
return bel[l] != bel[cmp.l] ? bel[l] < bel[cmp.l] : (bel[l] & 1 ? r < cmp.r : r > cmp.r);
}
} q[N];
- 对于某些构造题(不限操作次数,如 CF2143E),可以以此为切入点:观察操作中不变的量。这一条来自这篇题解。
- 正数和负数之间判断奇偶性不能使用
%2而应使用&1。 - 我他妈再 all in 某个假做法我就是傻逼。
- 线段树
l,r传参可减小常数。 - 不要预设题目难度。不要一味追求正解。不要预设答题情况和答题策略。
- 维护中位数状物,可以考虑将大于中位数的赋为 \(+1\),小于的赋为 \(-1\),求和。
- dinic 建双向边,计算边数要乘 2。
- 求最值问题可考虑利用二分转化为可行性问题进性求解。
- 当且仅当所有元素只需要考虑与某个常量的大小关系时,考虑用 01 染色。
- 树上 dfs 时,不同层的 dfs 之间不要使用全局的栈/队列/数组,避免冲突。
- 分类讨论时,进一步分讨时不要落下大的条件。
- 一对多考虑能否转化为多对一。
- 正难则反。
- 最大贡献可以考虑用总贡献减去最小的非贡献(求小贡献同)。
- 网格图考虑黑白染色。
- 对数组进行 swap 的时间复杂度是 \(O(n)\)。
- ACAM 多模式串匹配的时间复杂度是节点个数。
- 三角形三边中点、三条高的垂足、三点和垂心连线的中点,九个点共圆,且九点圆圆心为外心和垂心连线的中点。
- 序列分治时,若分治点不在中间,可考虑使用类似启发式合并的做法,每个区间内只遍历较短的一部分。
- 多测时字符数组要清空,如:若不清空求后缀数组会出错。
- 当一个思路做不通的时候,不妨考虑从另一个角度入手问题,不要死脑筋。
- 求最大值时 mx 的初始值应赋为 \(-\infty\)。
- 排列问题考虑置换环、二分图、平面直角坐标系、逆序对。
- 解决问题时考虑从局部扩展到全局。如贪心排序时,考虑二元之间的先后,进而扩展到全局。(邻项交换法)
- 复杂的 dp 考虑从高维高复杂度的 dp 做起,逐步优化。
- dp 优化考虑值域和定义域交换的思路。
- 多次使用栈和队列注意将 head 和 tail 清空。
- 堆的个数为 \(\frac{n!}{\prod siz_i}\)。
- 卡常时,可考虑使用
long long或__int128暂存数据,计算后统一取模。 - 考虑合理利用树剖性质:任意点跳轻边到根节点,至多 \(O(\log n)\) 次。
- 如果可以,务必手玩小样例。样例错误,务必重读题面。
- 可用
acos(-1)求圆周率。 - 若题目为至多选 \(k\) 个,可额外加入 \(k\) 个数,转化为恰好选 \(k\) 个数。
- 若数据范围很小,考虑状压、搜索。

右图是丞相帅照。
写一些这个警钟是十分必要的。这个不仅是一些做题技巧,而且是一些一定不能再错的东西。细节性问题,一定要注意。
浙公网安备 33010602011771号