赛前金句
-
考试的时候不要再建立一个主文件夹!!!它会帮你创的!!!(2023.10.18)
-
考试时看清楚输入输出文件,尽管前几题可能是ABC(2023.10.18)
-
输入输出文件一般而言都是小写打头(2023.10.18)
-
求操作次数最小的问题(最优化问题)有时也可以转换为判定问题(二分答案解决)
-
博弈论问题可以考虑将操作被动最优的人忽略(2023.10.18)
-
相信自己(
-
树形dp问题可以考虑转换成边的思路求解(2023.10.20)
-
dp问题能初始化就初始化(2023.10.20)
-
dp问题时间复杂度不优秀时考虑合并状态,难转移或无法转移时考虑拆解状态(2023.11.17)
-
一些题目中的定义会放在题目背景中,注意审题(星战)(2023.11.17)
-
不会的题,即使是第一题,想了半个钟就跳,能拿一分是一分!(2023.11.17)
-
不要第一时间就想到高级数据结构!(2023.11.17)
-
数论题再恶心也要看下去,能拿一分是一分(2023.11.17)
-
看着很恶心,数据范围开得很大的题目,打表找规律!(2023.11.17)
-
NOIP2023,破釜沉舟!(2023.11.17)
-
做需要离线的题目时记得区分n和q!排序时不要把q写成n!(2024.1.7)
-
网络流赋值时从1赋值到t,确保所有点都被赋值
-
dinic算法记得infl-=nt(流量)
-
记得给s的dis[] 和 infl[]赋初值
-
注意不要把sin和cos写反(我知道这很蠢但这就是我会犯的问题 2024.1.8)
-
double输出自动四舍五入(2024.1.8)
-
网络流建图边数能开多大就开多大(2024.1.8)
-
初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化初始化(2024.1.9)
-
写fhq的sep和merge时记得判断当前点为空的情况(2024.1.16)
-
#define size Size (2024.1.19)
-
撤销不了就分治 (2024.1.19)
-
在类似于斜率优化或单调栈优化或决策单调优化时,记得在清除先前不优状态时用while()循环,彻底清除干净(2024.1.23)
-
线段树上状态合并时,注意合并方向(左右 (2024.1.24)
-
费用流计算最终费用时记得拿距离乘上流量(2024.2.8)
-
最短路的角度想不通时,可以将原图转化为对偶图,在对偶图上考虑最大流/最小割,可能会更好解决(2024.2.15)
-
考虑题目时多做转化,具体如下:序列(无论异或还是加和)<->前缀和<->差分数组 最短路<->最大流/最小割 等差数列<->李超线段树<->斜率优化(凸包) 无向图<->树
-
根据一个数的根号来分数据计算时,考虑是否要+1(2024.2.16)
-
当区间的是否满足条件的角度不好考虑时,尝试从区间内每个点是否满足条件的角度考虑,再用线段树区间查询询问区间内所有点是否都满足答案(2024.2.17)
-
区间内有区间参与的问题可以从分治或是扫描线的角度考虑(2024.2.17)
-
当n很小却以次幂的形式存在于时间复杂度时,可以考虑折半,用双向搜索,$O(2^n) \rightarrow O(2 \times2^{\frac{n}{2}})$ (2024.2.17)
-
有关浮点数的题目多注意观察 int 和 double 相加或相乘的部分 警示后人(2024.2.17)
-
$C_{x+y}^{x}$ 可以转换为从(0,0)走到(x,y)的路径条数(2024.2.17)
-
注意数据范围,思路尽可能往值域较小的变量上靠(2024.2.17)
-
询问中有两个区间参与并且需要将两个区间信息合并的问题,可以把一个区间竖起来,转化为二维问题,扫描线解决(2024.2.18)
-
对于二维问题(包括双区间问题),能够离线就考虑扫描线,否则就树套树解决(2024.2.18)
-
当有指针指向数组元素时,可以考虑把指针放在数组前定义,以防越位到指针(2024.2.18)
-
注意数据读入顺序(2024.2.18)
-
区间间相互影响的问题,考虑离散化,变成多个限制区间的形式解决(2024.2.18)
-
当题目中存在向下取整的除法不好处理时,可以考虑反过来做,用一个区间的数的乘法来表示 例子 (2024.2.20)
-
求极大点双连通分量时,用指向点判断是否出栈而不是当前点(2024.2.21)
-
随机游走问题基本上都能使用动态规划解决(2024.2.21)
-
数据范围较小且每个统计的问题可以分解为几个互不相干的小问题再合并处理时,考虑区间dp(2024.2.21)
-
当求一个区间内每个元素的交集或每个元素若出现但仅统计若干次时,可以固定右端点,从左往右扫描并添加元素,每次删去左边的重复元素,查询时直接在主席树上查询即可 例子(2024.2.22)
-
判断元素个数是否为偶数时,可以考虑用异或操作(2024.2.22)
-
对于每一位只会出现一次的问题,可以考虑转化为一个数列(2024.2.23)
-
不要把容斥看得太麻烦,能用容斥就往哪方面多想想(2024.2.23)
-
当题目操作较多且会影响后续答案统计时,可以考虑操作分块(2024.2.23)
-
线段树上大力卡内存且每个点只需要一个参数时,可以考虑不建最下层的点,转而用最下层点的父节点的l r 来存储这个参数(2024.2.25)
-
线段树合并/主席树 + 区间修改 , 考虑转化为差分(2024.2.25)
-
dp状态可以尝试把离散的状态转化为连续的状态,便能使用差分优化,如原状态为 设 $dp_i$ 表示最小值为i的最小代价,可以转化为 设 $dp_i$ 表示最小值小于i的最小代价 (2024.2.25)
-
定区间+区间查询问题,可以尝试往单调队列的角度考虑(2024.2.26)
-
kmp的fail数组既可以指最长的前后缀长度,也可以指当前位的最长的前缀匹配,有时可以换定义来理解,在一些题目里面从前后缀的角度考虑会有意想不到的效果(2024.2.26)
-
通过不断跳fail的方式可以求出最短的前缀匹配,可以通过继承优化到 $O(n+m)$ 例子 (2024.2.26)
-
dp题目将答案分成若干个互不相关的部分来统计,可能会使答案的统计变得简单 例子 (2024.2.26)
-
仔细看好你填进去的变量到底是什么(2024.2.27)
-
求带删最大/最小值时,不要第一时间往线段树上想,考虑堆是否能行(2024.2.28)
-
珂朵莉树,分裂时先分裂右边再分裂左边(2024.2.28)
-
注意审题啊唇笔,注意“且”和“或”这样的字眼,手模完样例了再想怎么做,题都读不懂还做什么题(2024.2.29)
-
所有能考虑区间合并,且区间信息能够较快合并,区间合并与大小无关的问题都能够通过线段树解决,否则就考虑区间dp(2024.2.29)
-
区间绝对众数有四种找法,你知道吗?
- 二分答案,找区间内出现的数量
- 摩尔投票法
- 将序列有序后,取中间那个数,绝对众数一定是这个数
- 枚举每个数,将这个数所在的位置变为1,其余变为-1,找区间合大于1的区间
-
区间中位数也可以用二分答案法解决,区间内仅有大小比较的找数问题,都可以用 二分答案+01赋值法解决(2024,2,29)
-
区间找两个数异或的最大值有三种求法,你知道吗?
- 主席树上二分
- 可持久化trie树上寻找
- 找每个数所拥有的 $O(logn)$ 个支配数,具体看第 290 条 (Upd on 2025.1.4)
-
只有合并没有撤销的题,考虑启发式合并(2024.2.29)
-
第一次省选,一发入魂!(2024.3.1)
-
对于代价随着时间的变化而增长,满足条件后停止增长的问题,可以考虑把每一时刻的代价表示为每一时刻未满足条件的代价的和 例子 ,或是将每一段的代价乘上未来累计所需的时间 例子 (2024.3.1)
-
对于求期望的问题,可以转换为求每个代价出现的概率乘上代价的和(2024.3.1)
-
只有一个前驱节点的不一定是一棵树,也可能是个基环树(2024.3.1)
-
淦式子里面的整数能不能直接转成浮点数啊淦(2024.5.14)
-
喜欢我线段树上插查询但是不取max吗?(2024.5.21)
-
询问一棵树上一些标记点中祖先包含某点的数量,可以转化为求某点子树中有多少个标记点 阿狸的打字机(2024.5.29)
-
fail 不一定是祖先,祖先不一定是 fail ,找前缀跳祖先,找后缀跳fail (2024.5.29)
-
注意看题目中 n,m 分别代表什么含义及其取值范围(2024.5.30)
-
有时候AC自动机上打END的点不代表全部,有时还要看一些点的 fail 上是否包含它,即后缀是否包含它 文本生成器 (2024.5.30)
-
回文自动机,last 与 now 的区别 回文串 (2024.5.31)
-
后缀数组,将 x 设为 num 时,用 “++num” 而不是 “num++” (2024.6.4)
-
统计不同的子串数量,可以用每个后缀的长度减去每个 h[i] 求得(2024.6.13)
-
后缀关系或子串计数,看 parent tree,前缀关系或子串匹配,看 SAM 边(2024.6.13)
-
清空 SA 的时候,x[i],y[i] 都要清空到n+5,c[i] 清空到 505 (2024.6.14)
-
dp设计状态时不一定是“选择右端点”,也可以是“到右端点的区间已选择完”(2024.6.19)
-
后缀数组枚举每一位进行匹配时,可以像递推 h[i] 数组一样继承,从而使得枚举的复杂度降为 $O(n)$ 君名 (2024.6.21)
-
矩形赋值问题,往前缀和和差分方向考虑准没错(2024.6.23)
-
矩形问题注意观察左右端点是否能相等 爱丽丝 (2024.6.23)
-
当遇到 $\frac{x}{1-w}$ 这类式子且 w 有可能取到 1 时,可以考虑将 w 等效替换为 1-w rebuild (2024.6.24)
-
1<<(-1) 想死就直说 (2024.6.27)
-
splay树的rotate操作,pushup时先pushup位于下方的点(2024.6.30)
-
LCT的access操作,记得pushup(x) 弹飞绵羊(2024.6.30)
-
什么?这不是树剖,这是LCT,吸水之后变大变高,用LCT来判断环啊,做小生成树啊,都是非常方便的(2024.7.1)
-
匈牙利算法,用tim记录vis数组能极大优化时间 game (2024.7.3)
-
当涉及到异或操作时,多考虑其重叠部分是否会相互抵消最大异或路径(2024.7.9)
-
涉及选择几个数使其异或起来最小时,若有数必选,则其一开始就异或上,后面统计答案时再贪心选择,而不是丢到线性基里面(2024.7.9)
-
对于询问一个图是否是二分图,先考虑其中是否有奇环(2024.7.9)
-
如果只能合并长度为 $2^k$ 这样的序列,但却要将一个长度为 $n$ 的序列合并为一个最多有两种元素不同的序列,可以考虑取最大的 $k$ 使得 $2^k \le n$,然后合并区间 $(1,2^k),(n-2^k+1,n)$ 2different(2024.7.11)
-
对于区间取最小值且又有数字都对一个常数取 $max$ 的问题,可以直接不考虑取 $max$ ,这样就会取到最右侧的最小点 (2024.8.3)
-
对于几串括号序列串在一起,判断是否合法的的问题,可以将括号序列转换为一个二元组 $(sum,min)$,表示左括号减右括号的和 与 添加过程中 $sum$ 的最小值,添加时判断只需要看它加上 $min$ 后会不会小于零即可 (2024.8.5)
-
找一群数中找两个数的异或值的最大值,可以先排序再在 trie 树上寻找(2024.8.8)
-
找最…的区间或树上找…的链,可以考虑用分治对其进行分类再寻找 (2024.8.8)
-
当dp中有操作使得某一维变为…,且一些维度间并没有差别,可以考虑把这一维去掉,因为它已知 many moves (2024.8.10)
-
找前 $k$ 大/小 元素,用 nth_element() 而非 sort() 会更快 (2024.8.11)
-
当遇到 $\sum_{i=1}^{n}\frac{n}{i}$ 时,不要害怕,这是调和级数,可以变为 $nlogn$ (2024.8.15)
-
当多次询问询问最优方案,维护的信息较简单且方便维护时,考虑倍增 铁路(2024.8.20)
-
组合数怎么横向求前缀和 这里这里(2024.8.21)
-
SG 函数指的是 $mex(S_u)$ ,但是它的子节点中也可以有 SG 值大于其本身的,所以要注意反边也能连DAG(2024.8.22)
-
线段树优化dp,注意条件的清空顺序,特别是离散化歌姬(2024.8.23)
-
注意特判时输出前该加的变量加了没有exBSGS(2024.8.25)
-
能不用快速幂就别用快速幂(2024.8.25)
-
十六岁生日快乐!(2024.8.25)
-
当范围较小时(能开二维数组时),可以考虑用二维树状数组而不是树套树(2024.8.26)
-
当随机化判断正确的概率百分百,判断错误的概率较小时,考虑随机化多测几次 神秘题(2024.8.26)
-
对顶栈有时候没必要分中点重构,有时候直接分右端点会更优(2024.8.26)
-
有时候树剖没必要直接上线段树,可以用任意数据结构维护,如 set (2024.8.26)
-
注意模数到底是 $10^9+7$ 还是 $10^9+9$(2024.8.28)
-
即使是读入,也可能要先取模(2024.8.30)
-
对于取 max 还有一个分式的结构,可以变成 min 然后取倒数(2024.8.30)
-
ABC,看完题目再开始做,即使题面很长(2024.8.31)
-
当在外部使用 if 时,记得判断里面的break的范围 DNA (2024.9.1)
-
多项式积分可以通过将数组调小观察次数变化来调试(2024.9.2)
-
gcd相当于对所有质数取min,lcm相当于取max,利用好这两点有时可以省掉高精度或质因数分解(2024.9.2)
-
状压dp可以尝试搭配容斥,对时间复杂度的影响不大(2024.9.3)
-
状压多一维n一维不是大问题,不要惯性思维(2024.9.3)
-
状压判断两个集合的边是否有交时,可以用于集合有交的边的数量关系来判断$(a_{S_1}+a_{S_2}=a_{S_1 \cup S_1})$ (2024.9.3)
-
查后缀包含的区间和,可以不用二维数点(2024.9.3)
-
当你要向一个队列全局加一时,可以考虑添加一个新的元素,取出时的值设为(q.front()+q.size())(2024.9.4)
-
线段树合并,先合并后修改,否则两倍时间+空间常数 aaa被续 (2024.9.6)
-
如果你在写类似于并查集或是圆方树这类需要把一些节点当作一个节点的算法,注意你的节点对应的新点究竟是 i 还是 rk[i] 最小生成树计数(2024.9.9)
-
自然溢出不是取绝对值,取绝对值不是自然溢出!(2024.9.10)
-
$O(\sum_{d\mid n}d )= O(nloglogn)$ (2024.9.10)
-
cdq不一定是单纯左右递归完了再合并,也可以是先处理左侧,再合并左右,再处理右侧,像中序遍历(2024.9.11)
-
模 $X$ 意义下求某个矩阵的解,可以考虑高斯消元 和谐矩阵(2024.9.12)
-
无论怎么样,无向图上 dfs 考虑是否要设置 vis[i] 数组记忆化 桥碧萝殿下 (2024.9.14)
-
dp不能,上搜索,$2^n$ 不能,考虑搜索 战争调度 (2024.9.18)
-
看到异或先往线性基上靠,哪怕是在 SG 函数里 New Nim (2024.9.22)
-
动态规划问题添加元素不一定是唯一的出路,也可以考虑在原有状态的基础上合并状态 找硬币 (2024.9.22)
-
bfs塞入队列前,考虑是否要初始化 vis[] 数组 侦探已死 (2024.9.22)
-
tarjan里的 vis[] 数组代表是否在栈中,只有在出栈时才会设为 0 板 (2024.9.22)
-
固定右端点,一段数中不同的最大公约数的数量最多只有 $logn$ 个最大公约数 (2024.9.24)
-
如果公约数间有联系,不要担心不同最大公约数的数量问题 (2024.9.24)
-
二维dp很难从左往右推时,可以考虑固定右端点,向左去推 JYY病毒 (2024.9.25)
-
看到“循环”两字及计数,考虑矩阵乘法 位运算 (2024.9.26)
-
该容斥就容斥 (2024.9.25)
-
注意加边是加单向还是双向 (2024.9.27)
-
当字符串的个数固定,且要求字典序最大的最小时,可以求一遍后缀排序然后二分 llch分割 (2024.9.29)
-
树剖的时候,注意你填进去的究竟是 rk 还是 dfn (2024.9.29)
-
树剖可以尝试着把点的编号随机打乱下,因为可能会出现 rk=dfn 的样例 (2024.9.29)
-
树形 dp,当所有儿子合并在一起很难转移时,考虑变成一个一个添加草了,史题 (2024.9.30)
-
排列计数问题,找最后一个影响答案的位置 game (2024.9.30)
-
$n^2$ 以内都能区间 dp 记录区间最优决策,但不一定是标准区间 dp (2024.9.30)
-
当遇到只会向某一侧产生影响的条件时,找到最开始的点,递推即可 大树守卫 (2024.9.30)
-
树上添加一条边时,注意考虑环可以从左右两边通过(2024.10.2)
-
树内联通集大小,考虑类比dfs的过程,dfs序相邻的点的路径和除以二 异象石 (2024.10.2)
-
对于求解模数的问题,考虑在其整除的基础上减去一,得到模数减一的结果 homura (2024.10.2)
-
1e9 floyd ,循环展开!图函数 (2024.10.3)
-
floyd 一定好保证,$i,j,k$ 都枚举到 $n$ ,否则无法保证正确性 (2024.10.3)
-
对于取 $\frac{1}{2}$ 一类的问题,一半进一半出,考虑欧拉回路 (2024.10.3)
-
将图上的点拉平到序列上了之后,序列上某点处往左往右的数量一定相等 (2024.10.3)
-
边权为 $2^i$ 的图,其两两最短路为最小生成树 (2024.10.3)
-
审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题 (2024.10.4 模拟赛祭)
-
当 $n$ 很小且影响为一个区间时,考虑区间 dp (2024.10.5)
-
不要相信小样例,会变得不幸(2024.10.5)
-
注意数据范围,枚举范围不一定是输入数据中的最大值 (2024.10.6)
-
1e8 是能过的,不要过于相信本地结果 (2024.10.6)
-
求经过 $n$ 个点的最短路时,考虑直接 bfs (2024.10.6)
-
做当前弧优化时,如果有点会重复入栈,那么注意编号要取地址,否则复杂度会被卡成 $m^2$ 欧拉回路 (2024.10.6)
-
$O(n)$ 算多项式的值时,用秦九韶算法 解方程 (2024.10.8)
-
统计子串时,建trie可能会导致mle,考虑哈希解决可能更稳(2024.10.9)
-
当答案对某数取模且某数能拆成若干个小质数时,考虑拆成素数幂然后CRT合并起来 (2024.10.9)
-
快写时,记得考虑等于0的情况是否需要输出,否则可能不输出 (2024.10.9)
-
世界上有种图,叫竞赛图,缩点后会变成一条链 (2024.10.10)
-
把图拆成树,再对非树边跑树上染色,有时候对路径问题有奇效 CF512E (2024.10.10)
-
动态维持连通性时,割点有奇效 图的分割 (2024.10.10)
-
考试不到最后一刻不要放弃,加快速度才能有更多机会 (2024.10.11)
-
当遇到带修的 dp 时,注意分析其是否具有可撤销性 (2024.10.11)
-
无论怎么样,总得试试反过来做 (2024.10.11)
-
若一棵树有两个重心,那么每个重心的最大子树一定是另一个重心为根的子树 (2024.10.11)
-
审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题审题 (2024.10.12)
-
笛卡尔树在处理区间最大值于…的关系这类题时配合启发式合并有奇效 异或最大值 (2024.10.13)
-
当状压枚举子集行不通时,想想类似复杂度的算法,比如说容斥 小星星 (2024.10.14)
-
看到组合数与次方的结合时,第一时间要想到普通幂转下降幂 Team Work (2024.10.14)
-
当有操作涉及到对集合中的选择一个或两个元素同时进行操作时,可以考虑向集合中添加类似 “0” 的元素,这样就能将选择一个元素的方案合并到两个里面去 1 or 2 (2024.10.14)
-
注意分析题中最坏能卡到多慢,有时能发现根号的存在 (2024.10.14)
-
$\max{ a,b }=\mid \frac{a+b}{2} \mid + \mid \frac{a-b}{2} \mid$ (2024.10.15)
-
当遇到“使得任意两个数都有 $a+b \ge k$”这这样的题目时,可以考虑将数分为两类:一类是 $a*2\ge k$ 的,另一类为其他,分别根据他们的性质分类讨论 老K (2024.10.15)
-
当遇到“排列某些数使得…”这样的题时,先往排序的方向上思考,再不济就dp (2024.10.15)
-
$\sum_{i=1}^{n-1} \sum_{j=i+1}^{n}a_j-a_i =\sum_{i=1}^{\frac{n}{2}}(n-2i+1)(a_{n-i+1}-a_{i})$,在遇到递增数列两两间差值求和时可以考虑用这个式子 两两求和(2024.10.15)
-
在遇到序列差值的绝对值时,第一步考虑将其转化为一个单调序列 (2024.10.15)
-
对于每一步变化一个位置,统计答案总数这类的的题,可以考虑拆成两部分:操作序列和初始序列,考虑将他们以某种方式合并可能会是一种思路 集合打分 (2024.10.15)
-
$C_{n}^{i} \mod 2 =\begin{cases} 1 && i& n=i\
0 && otherwise\
\end{cases} $,转化为枚举子集的式子 前缀xor (2024.10.16) -
$2x \equiv 2y \pmod{P}$ 是,可能是 $x \equiv y$,也有可能是 $x\equiv y + \frac{P}{2}$ (2024.10.17)
-
做序列分割这样一类的问题时,考虑决策的交和并的关系 (交比并优或并比交优) (2024.10.17)
-
在做涉及到类似向量一类的问题时,考虑将两点化为线,将三点化为面 合金 (2024.10.18)
-
当涉及到多维度的条件时,注意观察题设条件,看能否用某些维度表示出剩下维度 (2024.10.18)
-
断断续续做了一年记录了,感悟良多,没想到当初的一时兴起居然能坚持这么久 (2024.10.18)
-
窝趣怎么都一年过去了,要退役了啊! (2024.10.18)
-
数位 dp 不要过分关注于当前完整状态,注意到当前能够支持合并的特征状态即可 (2024.10.20)
-
当发现求解某一问题时可以将其转化为更小规模的同等问题时,不止可以考虑分治,更可以想想记忆化搜索,再用记搜的式子推出 dp 式,转化为动规问题 (2024.10.20)
-
当遇到两个数的异或一类的问题时,首先考虑能否将这两个数绑定为一个二元组,再对每一种二进制情况进行讨论 (2024.10.20)
-
向左右染色问题一类的问题,可以转化为求本质不同子序列 (2024.10.22)
-
将树上染色的第一个点作为根,说不定会有奇效 树上询问 (2024.10.22)
-
调和级数不止可以用于枚举倍数,还可以用于取模的分块计算中(前提是取模连续) 例 (2024.10.22)
-
分类法是个好东西,特别是在计数本质不同问题时 (2024.10.23)
-
看到序列操作+加减加减加+121 这类题,想想有没有可能是 $n$ 阶差分 (2024.10.24)
-
当遇到二选一这类做选择的题目时,可以考虑建图连边,用边的方向来代表选择,可能会有奇效 (2024.10.25)
-
当遇到类似…图形完全包含…图形的题目时,考虑从中间往外射线,考虑是否经过奇数个点,可以拆成分层图表示经过奇/偶次射线的情况,最后变成这两种状态间的路径问题 冲浪 (2024.10.28)
-
注意当使用set时,若结构体由多种元素构成,当心因比较函数导致的去重自动 (2024.10.28)
-
看到两数异或+大小比较,首先要想到trie (2024.10.29)
-
当序列上推式子很麻烦时,考虑转化为桶试试 (2024.10.30)
-
对递增序列计数时,可以考虑枚举其的差分数组 (2024.10.31)
-
对欧拉回路计数,可以考虑用BEST定理 (2024.10.31)
-
当涉及到循环位移直到遇到空为止的问题时,考虑多开一个点,建环,变为判定多开的那个点是否被覆盖 座位安排 (2024.10.31)
-
当看到序列某段前缀和不得低过某定值时,考虑用 Raney引理+原排列计数 游戏王 (2024.10.31)
-
集合计数问题,注意转移时是否记重的问题 (2024.10.31)
-
当题目涉及到“一棵树上加上一条边”时,考虑对这个可能的环单独剖离出来,树的其他部分照旧 落忆枫音 (2024.11.1)
-
dp时线段树不一定用来维护决策点,也不一定用来维护dp值,最好两种情况同时分析取最优 Help Yourself P (2024.11.1)
-
当很难一个个的求解出函数值时,考虑递推式 (2024.11.4)
-
当元素种类只有两种时,此时的交换两个元素可以等价的视作“将某个元素修改为另一种元素” 教主 (2024.11.5)
-
当遇到“买一送一”这类题时要注意,买后还没送时游戏是否已经结束 打砖块 (2024.11.5)(感谢 @liugh_ 的贡献)
-
有时候在序列整体上去考虑组合插板,会比转化为序列分割更容易 一个仇的复 (2024.11.6)
-
二项式定理展开时,注意符号的指数究竟跟的是哪个 (2024.11.6)
-
当当见到形如 $n^0,n^1,n^2…$ 这样的形式时,考虑转化为 $n$ 进制解决 (2024.11.6)
-
分段矩阵快速幂,时间复杂度不会有很大的变化 Odd Steps (2024.11.7)
-
对于无后效性的序列递推,考虑矩阵快速幂解决 (2024.11.7)
-
对于图上取min/max的问题,考虑用最短路优化 (2024.11.8)
-
对于操作有规律变化的最短路问题,可以尝试分主元,拓扑+最短路解决 图上游戏 (2024.11.8)
-
李超树+线段树合并是 $O(nlogn)$ 的(2024.11.11)
-
当遇到决策点全局加,询问某固定区间 $[l,r]$ 内是否有决策点时,假设有三个决策点 $a_1<a_2<a_3$ ,且有 $a_3-a_1<r-l$ 时,决策点 $a_2$ 可以视作无用 背包(2024.11.13)
-
当遇见需要用类似断环为链的思路解决的题目时,可以尝试考虑环上的特殊点,从而使得不再用枚举断点 foo~ (2024.11.14)
-
对于整个序列全局加/减,部分位置特殊变化,求最值何时变化为特定值的问题是,可以考虑直接设最值为状态而非整个序列 add 1 (2024.11.15)
-
DAG上生成树,考虑对每条横插边分别考虑 (2024.11.15)
-
子树内计算符合条件的点的数量,考虑转化为在数轴上某区间内点的数量,然后转线段树合并解决 道路修建 (2024.11.15)
-
当遇见对某些数取模且都等于定值时,考虑做差成0,变为寻找因数 Mod M(2024.11.15)
-
当在平面上找顶点使得构成轴对称图形时,可以尝试着找边的中垂线,变为寻找是否存在相同线段的问题 等腰梯形 (2024.11.16)
-
增长量的递减也可用于二分 平均值与中位数 (2024.11.18)
-
使用欧拉回路做“某段路径被经过若干次”这类的题目是,注意BEST定理计算的是两点间若干条边有顺序的方案数,一般情况下应当除去 $\frac{1}{w!}$ 将顺序消掉 Counting Prefixes (2024.11.18)
-
当循环复制的次数很大时,考虑每次循环是否都能够产生贡献 或 循环过多会导致答案成为定值,实际应循环次数与数量级不符 复制最长上升子序列 (2024.11.19)
-
当先选定区间两端点再选定区间中的元素是,尝试着看区间能否贪心的取最大 马拉松 (2024.11.20)
-
有时候分奇偶讨论会有奇效,不要担心麻烦的问题 酷酷牛牛序列 (2024.11.20)
-
当想到可能会炸 long long 时,在代码一旁标记上,警示后面的自己记得开 long long (2024.11.21)
-
当一个序列的需要由前边的元素推导得出后边的元素时,考虑该数的实际值是否重要,还是仅仅只需要满足递推式即可,(说人话:数列的递推式能不能变为下一个元素是否可行的判别式)歪果仁 (2024.11.21)
-
对于边权较小的最短路,考虑bfs (2024.11.22)
-
对于具有博弈成分的题目,分清主次,既谁的决策决定谁的决策 (2024.11.24)
-
对于生成一个序列使得其中的最小值最大的问题而言,照样可以使用动态规划解决,对于前一步决策取min,对方案取 max 即可 金山打字王 (2024.11.24)
-
当遇到类似倍数或是整除的问题,当每个数唯一出现时,考虑枚举倍数,时间复杂度 $O(nlogn)$ ,当每个数并不唯一出现时,考虑枚举因数,时间复杂度 $O(nlog^2n)$ 区间最大最小倍数 (2024.11.24)
-
当遇到数位dp且两两数之间仅有一部分的限制关系,可以考虑将其在状态中存储下来,用类似分治的方式解决 popcount(k)区间计数 (2024.11.25)
-
不妨试着大力枚举一下,万一某几步过后所有决策都变得确定了呢 行取反与列最大 (2024.11.25)
-
exgcd求逆元,注意在返回时取模,可能得到负数结果 (2024.11.26)
-
分多段矩阵快速幂,尝试预处理二的次幂,这样矩阵乘法时可以省掉一个n(因为只用处理一个行向量与矩阵相乘) 老八(2024.12.17)
-
概率是顺推,而期望需要逆推 (2024.12.17)
-
优化矩阵乘法的取模,可以考虑用一个int128的数组来存,计算完后统一取模 (2024.12.17)
-
当遇见子串+前缀相同段长度的问题时,考虑SA 串 (2024.12.24)
-
对于求是否构成有序数列的题目也可以考虑倍增,考虑跳 $2^j$ 次到达的点,只要每个点到达时的所代表的状态相同即可 宝石 (2024.12.25)
-
对于钦定一个序列一类的问题,若我们不需要知道序列的全貌,可以考虑状压解决 滚榜(2024.12.25)
-
高楼抛鸡蛋 (2024.12.26)
-
纸带的折叠的长度结果与纸带的折叠顺序无关 折叠纸带(2024.12.26)
-
LCP有两种求法,你知道嘛
- SA/SAM 朴素求
- 前缀哈希+二分(可搭配主席树)
-
比较两字符串字典序,可以通过找到两字符串 LCP,并比较 LCP 后一位字符大小的方式实现(可搭配 hash+线段树一类数据结构前缀求和) 例 (2024.12.27)
-
SA做某后缀的最长公共子串,相当容易 (2024.12.27)
-
动规转移式可能可以通过左右两侧同时变换得到相同结构式,留心观察 熟悉的文章 (2024.12.27)
-
当动规中的某个状态的范围与值域有关时,考虑将其变为动规的结果 (2024.12.27)
-
随机数列最长上升子序列的期望长度为 $O(\sqrt n)$ 好像只能计算机近似计算 (2024.12.27)
-
区间内两数异或的和 $\sum\limits_{i \in [0,r_1]}\sum\limits_{j \in [0,r_2]}i\oplus j$ ,发现若有其中一个的表示范围能够拆分为为 $a + [0,2^{i}-1]$ ,那么后半部分无论与何数异或和都不变,对于两个与上述同类的数而言,则和将完全取决于后缀较长的一个,故可将 $r_1,r_2$ 按照 lowbit 二进制分解,$O(log^2)$ 的合并即可得到答案 (2024.12.28)
-
当碰到“某类方案数的 $x$ ”次方一类的题目时,可以考虑用类似多项式拆分一类的方法,将其拆为“ $x$ 个线程同时,全程相等的方案数 ”管道取珠 (2024.12.29)
-
当动规转移式与值域有关时,分析其实际值是否重要,通过离散化缩小范围 划艇 (2024.12.29)
-
当遇到质因数分解+状态压缩/容斥一类需要减小 $n$ 的范围的题目时,考虑将其分解为大小质数 寿司晚宴 , 卡牌 (2024.12.29)
-
有时候适当的分段进行 dp 会更好做(当段与段之间相互独立时) (2024.12.29)
-
概率dp中,当你钦定了某个状态时,记得从反面去思考:这个状态同时确定了哪些信息 亚瑟王 (2024.12.29)
-
当区间/矩阵大小固定时,考虑使用单调队列来省去一个维度 爆弹魔 (2024.12.29)
-
不一定只有字符串才会用到哈希,具体要看这个数列是否需要满足字符串的某些形式(如字典序等) 系统设计 (2024.12.30)
-
我擦这自然溢出真好用吧,取模我们不熟 (2024.12.30)
-
当遇到图上点分类染色一类的问题时,从其连通性角度思考有无特殊性质 (2024.12.30)
-
对于子区间计数问题,考虑将其转化为变为二维平面,换成 2-side 矩形进行二维数点解决 LXLの课件 (2024.12.30)
-
区间判断是否可重排为 $k=1$ 的等差数列有三种方法,你知道吗?
- 若并不保证为一个排列,则可以取平方+哈希计算等方数列 大母神
- 若保证为一个序列,则可以 $max-min=r-l$ 计算
- 若保证为一个序列,则可以计算其与数轴上相邻两项重合的部分,区间加重合部分表示相邻段的个数,根据鸽巢原理可得联通块数量,为 0 则连续
-
如何判断是否为 一棵树,同时满足无环(LCT/并查集)与点数-边数=1 (2024.12.31)
-
当分析性质时,若有不同联通块间的信息,则需要考虑是否会影响到所有联通块 (2025.1.1)
-
区间加+区间查询值域区间数的个数,可以分块 由乃打扑克 (2025.1.1)
-
不一定要对时间扫描线,也可能对序列扫描线会更好解决 序列 (2025.1.1)
-
判断为空/与0取max可以考虑根据上一次被清空位置分段 美食家 (2025.1.2)
-
一个排列的逆序对数,与其的复合逆的逆序对数相同 (2025.1.2)
-
当遇到方案数对 $2$ 取模的问题时,考虑能不能构造双射使得其去除掉某些计算过程,或将不满足条件的方案剔除 (2025.1.2)
-
对于方案数对 $2$ 取模的题目,考虑是否能够通过 bitset 优化 (2025.1.2)
-
当遇到某些选择只有两种变化,问合法方案的题目,考虑使用 2-sat解决 毛子老哥重量级建图技巧题 (2024.1.3)
-
利用好 2-sat 的传递性,可以轻松实现区间加限制 (2024.1.3)
-
如果建图中只有前缀加边,可以考虑不使用线段树优化建图而使用前缀优化建图 (2024.1.3)
-
判断是否为必割边后,记得判断是否要返还流量 (2024.1.3)
-
当遇见判断区间是否为等差数列时,可以转化为区间内所有数 $\mod d$ 意义下相同 (2025.1.4)
-
负数取模无论在什么情况下,只要不保留符号,那都是用
(a%d+d)%d
(2025.1.4) -
非 4-side 矩形查询,就可以尝试使用区间取 min/max 解决问题,单点查询的区间 min/max 问题,可以标记永久化的搞 (2025.1.4)
-
对于查询 区间 两数异或最小值的问题,可以考虑求出某个数仅有的 $O(logn)$ 个支配数,变为查询支配对的最小值问题 区间最大异或值 (2025.1.4)
-
稍微尝试着扩域,可能能够发现不合法方案一定不优 (2025.1.5)
-
当碰到关于圆的计算几何题时,记得多从反面去考虑,即将圆变为一个点,然后对其他图形向圆心收缩 失望至极 (2024.1.5)
-
博弈论不一定要推奇奇怪怪的式子,也有可能从最朴素的 dp 出发也能达到推出类 SG 函数的状态式,而且就大部分题目而言的话还是 dp 占大头 Subtangle Game (2025.1.5)
-
当线段树上维护当前点与左侧一个点的差时,记得每次更新一个点时还要对 右侧一个点 更新答案 琪露诺大战等差数列 (2025.1.6)
-
当遇到序列上改变一个元素,会对其他元素相互间有影响的时候,最好把所有可能的情况都更新一遍,有时候同种类型的元素之间也会产生影响 (2025.1.6)
-
当遇见是否完全包含某类区间的问题时,找出是否有完全包含某区间,但是产生贡献相同的情况,将较大那一方删掉(因为一定不优),借此减小询问复杂度或修改复杂度 垃圾桶爱情故事 (2025.1.6)
-
对于区间推平,每时刻都有位置加上定值(每个点加上的值不一定相等)的问题,可以对查询区间内上次修改时间不同的子区间全部查询一遍,因为最后推平所以时间复杂度不变 (2025.1.6)
-
对于区间每时刻加,加后有上限的问题,可以将所有数分为“已经爆仓”和“没有爆仓”两部分,计算出每个点经过 $a_i$ 秒会变爆仓,设上次修改时间为 $x_i$ ,当前时间为 $T$ ,那么判定他爆仓的标准即为 $T-x_i \ge a_i$ ,变为一个二维数点问题 Little Pony and Lord Tirek (2025.1.6)
-
问凸包的形成问题,考虑 dp,但这样的转移是无序的,因为是个凸包,所有可以考虑极角排序,最后边回到起始位置时一定构成凸包 五个点凸包?一辈子乐队! (2025.1.6)
-
嘻嘻我是第三百条 tips (2077.1.6)
-
遇见分割凸包的问题时,考虑使用区间 dp 将其分割为若干个子问题解决,由于凸包的特性,无论怎么分都相当于序列分割问题,注意枚举的中点 $k$ 不代表“在此处分割”,而代表着“从将该点左右两侧的凸包合并” (2025.1.6)
-
二维数点问题也要注意是否需要开 long long (2025.1.7)
-
2-Sat 中可以通过向自己的反连边的方式代表某个点不能被选择 (2025.1.7)
-
产生对立事件时,无法使用拓扑序推出 2-sat 方案,此时可以使用拓扑排序跑SCC的反图求解答案 [NOI2017] 游戏 (2025.1.7)
-
在2Sat中,记得将反向关系添加上才能保证最后方案搜索的正确性 (2025.1.7)
-
找到以一个点为右端点的最小区间使得区间内包含所有元素,可以用 $f_{i}=\min\limits_{i<nxt_j}j$ 来求 (2025.1.8)
-
当遇到排列问题问某数成为排列内最小值的概率时,需要额外考虑那些 已经确定比他小的数 造成的影响(具体来说,已经确定比他小的数会将其额外垫起来一部分,从而导致其概率发生改变) 堆上大小比较 (2025.1.9)
-
- 对于线段树优化dp的问题(例如多个区间的最大子段和),可以考虑将其转化为 max+ 矩阵去优化求解(前提是具有线性递推性质)两个子数组 (2025.1.11)
-
博弈论中,盯好变与不变量,结合结束状态+不变量反推出中间过程,构造方案使得某些量一直不变且与结束状态相同,常见的不变量有和等 (2025.1.11)
-
博弈论问题,可以尝试将元素分组,利用二分图一类的性质,选择一边时就直接选择另一边 偶遇两人选数取min相减,实力强悍强如怪物,拼尽全力也无法战胜(2025.1.11)
-
对于区间内每个数的贡献为前缀max/min的问题,可以考虑用线段树单侧递归解决 第一回日本最強プログラマー学生選手権決勝 (2025.1.12)
-
对于随着序列变化而递减,最后会减至 0 ,不再变化,单点修改的问题,可以考虑转化为括号匹配模型,使用单侧递归解决 第一回米国最強プログラマー乳牛選手権決勝 (2025.1.12)