notes-and-tricks
-INF HN-00338
-1. https://www.cnblogs.com/C202044zxy/p/15126199.html
0.注意不要把题想得复杂
0.5 NO #define int long long Use #define ll long long
- -fsanitize
- 树上构造 链/菊花/完全二叉
- 通读所有题,想清楚细节再code
#define EVAL(x) cout << #x " = " << x << "\n"
拜谢ClHg2#define CALC(x,y) cout<<#x"e"#y"="<<x##e##y<<endl
eg. $CALC(2,2)=>2e2=>200$- 对于可变状态,一般比特殊更容易计算时,考虑特殊状态何时转移到一般状态
- Prufer序列在树上计数/构造中十分重要。先考虑之。
- 完全背包要先弄完所有$2^i$再
lowbit
建立其他物品。 - 计数考虑容斥原理和拆式子(总数减去不满足数)。
- 最近点对问题有一个通用思路,就是找“支配点对”,也就是说,有许多的点对是没有用的。求 LCA 满足性质的方式就是 dsu on tree 形式的支配点对,与距离相关的则是更常用点分治。
- 轻重链剖分在静态树上统计时优先考虑。
- 有修改可先考虑无修情况。
- 细节尽量少。推式子时间$<<$debug时间。
- dp状态过大时,有两种思路:i)增加状态数量 ii)对状态增添限制。
- 无向图BCC缩点后是一棵树,树边是割边。
- 在想转移之前,为了防止做无用功,最好先想想该如何统计答案。
- 无向图的 DFS 树有一个极好的性质,就是图中的非树边只能是返祖边。
- 模意义下分数期望最优化直接无脑dp
- 计数题大量重复贡献考虑桶
- 序列题放在链上 考虑u>v。
- 平等对抗游戏 SG or 寻找次优解 (IOI 鳄鱼)
- 哪个数字小对着哪个淦
- 前缀和优化DP
- 推式子降次:log某数(通常为式子中的幂次)
- 枚举一个集合 $P$ 的子集 $Q$ :
for (int Q = P; Q; Q = (Q - 1) & P);
时间复杂度 $\mathcal{O}(3^{|P|})$ - 状压debug:
void print(int x){for(int i=0;i<n;i++)cout<<!!(x&1<<i);}
- 性质,特点,信息
- 树转化为菊花->菊花套链。
- 组合意义计数题考虑插板法与打表验证。线性的玩意不一定是dp。万一是组合数呢?
- 固定长度静态区间和的奇怪题考虑算出前缀和后差分约束。真的很妙。扩展:尝试将一些东西数据结构建模,每一种东西建模为某一种操作。
- 同贡献的多源最短路可以将所有源点的dis设为0。eg9432
- 基环树森林考虑并查集
- 对于多维前缀和,$s_{i_1}-s_{i_2}=s_{j_1}-s_{j_2}$转化为$s_{i_1}-s_{j_1}=s_{i_2}-s_{j_2}$。反之亦然
- 状压可折半搜索(补集)
- 随机赋值,最后一个赋值前缀xor和。可用于判断某种点是否全部包含或者正好包含所有种类的点。(3587)
- 点双考虑建立圆方树。圆方树的一个常用技巧:路径统计时,点赋上合适的权值。
- 考虑题目中隐含的拓扑关系与单调性。
- 树形背包:当前点1维,子树状态1维,自身状态(选)1维。这玩意是先处理儿子再做父亲。
- 区间异或和与常数比大小:算出异或前缀和然后自高位向低位建立01trie
- 想到了点分治/树分块但是不会?试试树上DP!
- 倍增很好用。
- 单调栈用来求函数 $f(i)->$ 数列中第 $i$ 个元素之后第一个大于 $a_i$ 的元素的下标
- 次优化问题可以参考最优化问题,记录次优解。
- 矩阵乘法没有交换律但是有结合律。可以利用这个性质来做一些类似括号序列匹配的东西。
- 当直接做似乎不可做时考虑二分答案/倒着做。
- 明确的终点比明确的起点要容易,而且它们之间有着显然的转化。
- 重申,静态区间操作转化为前缀操作。
- 40-60分做法一般提示正解。
- 模拟费用流:贪心。手动模拟费用流的增广,以它推出dp或者贪心式。在省选及以下的常见模型只有二分图最大匹配。五种情况:直接流,退流a,退流b,同时退流,other(因题而异)。建立堆是常用做法。eg,数轴上有洞和老鼠,每个老鼠分配一个洞,求每个老鼠走到属于自己的洞的距离和最小值。这是什么?反悔贪心!
- dp状态表示必须选a个,其余状态总量已经决定的,考虑模拟费用流。
- 树上选k条从根出发的链使得选边总权值最大/小,连边$(u,v,1,-w) (u, v, inf, w), ans = 2 * sumw - \text{mincost} $而且性质,费用流不退流->k次dp。(dp模拟费用流)
- 见到二分图不是KM板子就是网络流。不是踢我。
- 发现你的贪心假了之后不妨顺着这个思路想dp做法。
- 离线区间高难度查询考虑莫队或按某端点排序。具体地,对于递增的r,所有l的值即为区间历史和。(联考20231102)
- 对于区间上的带有支配点的所有子区间和问题,可以离线然后作出线段树维护支配的信息,然后维护全局/区间历史和来做。同上&NOIP2020比赛
- 对于把现在的要求移向未来相当于把未来的要素移动回来。
- (模拟)费用流先跑一定跑满的边,可以避免负环(老鼠进洞慎用)
- 每次操作都会被吃一些东西?时间倒流转化为每次操作给一些东西。
- 子树问题不要非常sb的想对于某点的所有子树,直接考虑以它为根的子树。
- “必经之地”->割点->圆方树
- 对于可以分段计算的式子尽量不要整体开算
- dp式子优化山穷水尽?组合意义优化dp:AGC013E AGC001E
- 写完后马上手造数据/对拍T1。
- 对于二维操作(区间LR(eg扫描线),双贡献),考虑对二维操作。
- 不能直接暴力的组合数?使用组合意义。一般是卡特兰/插板法模型。
- DP可以从状态的两端思考,可能会有更好的转移。
- 期望dp按目前状况的所有情况列出式子然后化简得出dp递推式。
- priority_queue清空的时候直接使用构造函数赋值。少一个log。
- 对于可排序的东西(代价不由下标决定)而且代价由分组minmax决定的东西,可以考虑先排序在分组,然后就看作括号匹配。CF626F。
- pbds平衡树使用pair防止物品重复。
__gnu_pbds::tree<pair<int,int>,__gnu_pbds::null_type,less<pair<int,int>>,__gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_stastics_node_update> T;
这一行不记得就使用code::blocks - 仔细看题,有些新定义和你的原来理解不一样。
- 对于所有子区间的计数问题(容斥常用):i)分治+算贡献 2)直接算贡献 3)拆开算(若贡献相互独立)
- queue的默认插入端是back
- pbds tree join 的复杂度是假的
- 反向dp消除后效性
- 重申,哪个数字小对着哪个淦
- Another Way? Another Score? Another Sol? Do not be so worried. Do not be so hurried.Do not be so greedy.
- 利用三角形不等式构建贪心策略。eg.Gym 104077D
- $a_i$单调不减等价于$a_i+i$严格递增
- 慎用构造函数赋值。复杂度memset。
- 不要边读入边回答。
- 爆int128试着用long double
鸣谢:很多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】