总结
主要用来写一些自己的漏洞和一些技巧
最大的漏洞:不记得更新这篇博客……
数据结构
并查集要记得初始化
结构体构造函数的时候类型记得和结构体内部的内部类型一致
Splay:(平均一个题4个小时我也是很服气
-
一定要记得随时splay要不然会T(当然还得记得及时update不然在一些需要siz的操作会寄
-
如果是区间翻转的时候,splay的时候要顺便pushdown,先pushdown父节点再pushdown自己(我也不知道为什么反正这样对反过来就错
-
(还有就是我的splay空间复杂度非常玄学,自己算算然后开数组就行了,能开多大开多大
-
永无乡:在一个并查集里的东西要记得特判,不然就像我的splay一样所有的cnt都大于1了呜呜呜(然后就90分,我一直还以为并查集没啥错误来着真的是
LCT:(竟然一遍过了一次太nb了!
- 区间翻转的时候,要开一个数组往上记录都要更新哪些点,然后把那些点拿出来都pushdown一遍,但是我总是忘了y = fa[y] 和top--
统计全局的tag,插入的时候减去tag,取出的时候加上tag
如果在求较大较小值的时候,设初值一定要好好设……能设多大(小)设多大(小)……
线段树记得开空间左移2,主席树要左移5
define int long long之前先算一遍空间
如果有区间加减到一定值删掉的操作,可以区间的值砍半挂到分治中心上做就是log得了
线段树合并很多时候有奇效,比如子树内的答案操作序列是自己的子序列的时候,可以用线段树维护半群运算之后线段树合并 UOJ418三角形
有的时候区间操作的时候,不是说 \([l,r]\)的最小值就是 \(l\) ,最大值就是 \(r\) ,而是区间内维护的东西的最小值或者最大值比如一个数组 \(a[l...r]\),容易写挂 CF1628E
只要是瓶颈路问题(最大的可以到达的边权或者小于等于一个数的所有边能到达的....)很多都可以考虑 \(kruskal\) 重构树 CF1628E
如果操作是形如,修改一个点的颜色,问深度最小的子树内包含所有白色点的点,可以将 \(dfn\) 序最大最小的两个白色点取出来之后取 \(lca\) CF1628E
如果一个点x到达不了点分树上的祖先y,那么他就不能到达y的其他子树的点,换句话说就是x要到y一定会经过在点分树上他们的lca 成都七中
如果一个点的权值有一个 \([l,r,c](l\le r)\),并且查询的时候要查询 \(x\le l,r\le y\) 的所有点的 \(c\) 颜色数,我们可以把所有查询和点按照 \(l\) 从大到小排序之后维护每个颜色的 \(r\) 的最小值,然后在数据结构上查询 成都七中
在线段树上一个区间操作是,所有操作到的最底下面的节点,从左到右是先一段右儿子再一段左儿子 【UNR #1】奇怪的线段树
有时候一些奇怪的东西可以转化为偏序问题之后用数据结构维护 3.28T1
在求类似第 \(k\) 大 的东西的时候可以维护多元组 \((i,j,k)\) 表示现在在第 \(i\) 个位置,选了第 \(j\) 大的值,总共的和是 \(k\),转移的时候可以考虑转移到下一个位置的最小值,也可以转移到当前位置下一位,也可以在这个位置是 \(1\) 的时候将这个位置置成 \(0\) 之后去下一个位置将其置成 \(1\) P6646 [CCO2020] Shopping Plans
写FHQ的时候要记得pushdown和pushup,记录siz和sum的时候需要记录每个点单独的sz和val
求凸包的时候可以采用分治的方法,先把两个端点求出来之后用这两个点的斜率切凸包之后用这个点把凸包分开求左右两边 最小乘积生成树
对于一个序列的逆序对来说,它的所有 \(\sum_{(i,j)}j-i = \sum_{i=1}^n i*(p_i - i)\),所以在进行交换操作的时候可以拆贡献直接算
长链剖分的时候如果需要换根可以通过一个 \(dfs\) 处理出来 \(f\)之后再通过一个 \(dfs\) 将 \(f\) 的操作进行撤销求出当前子树的 \(f\) 之后再求出这个位置的 \(g\) 数组 P5291 [十二省联考 2019] 希望
长剖的时候一定记得把指针移动,不然会寄
\(max\) 卷积可以用线段树合并来优化,线段树上面维护区间和,区间和可以用来表示前缀和和后缀和 NOI2020 命运
\(max\) 卷积也可以用打后缀乘法标记的方法维护,只不过可能只适用于 \(\sum len\) 比较小的情况,见下面的那个题
长链剖分的时候可以在树上打后缀标记,只需要每一次查询的时候往后进行 \(pushdown\) 即可,不过其实也可以把全局乘一个 \(tag\) 之后再把前面部分的值乘上逆元 十二省联考2019 希望
形如需要分治求解的题目,如果不好维护一些前缀后缀的东西,可以将当前区间转化成更小的区间然后挂在另一半区间上面进行递归求解,这样复杂度只会多一个 \(\log\)
trie树可以维护若干个数中 \(x\oplus v \gt p\) 的权值
一个数组的本质后缀不同绝对众数只有 \(O(\log n)\) 种
一个区间的绝对众数在左右区间中至少一个是绝对众数 ARC159F
\(n,q\) 不同阶的时候可以考虑猫树
笛卡尔树上如果自己是父亲的右儿子,那么父亲便是自己单调栈上的前驱
一些值域区间问题要想二维数点一类扫描线问题 2261. 【2024河北省队集训Day1T1】Bitset 大师
根号重构是个非常厉害的技巧 2266. 【2024河北省队集训Day2T3】异或
一些关于区间最大最小值的问题可以先套一层分治进行求解 CF1849E Max to the Right of Min CF1609F Interesting Sections
区间暴力需要枚举端点往下类似笛卡尔树的分治的时候(就是不确定分治中点的时候),可以采用启发式分裂从两边往中间找数 CF1849E Max to the Right of Min
区间的询问或者操作可以转化成前缀操作来做 CF1392G Omkar and Pies
\(trie\) 树可以支持分裂合并,并且 \(trie\) 树上支持打标记 CF1515H Phoenix and Bits
给一个集合,可加可删,求位运算,就往 \(trie\) 方向想 6.25模拟赛T2
DP:
有很多的dp是有一些不能相邻一类的条件,这时候我们可以设状态表示现在又多少段,每个段怎么样的。。。
一个dp式子或者数学式子可以在交换求和号等等的交换情况下交换出来一个可以用前缀和优化的形式
有时候我们的dp是可以带着方程的系数进去递推出来结尾的方程系数的(待定系数法)
区间dp很多时候都是 \(f_{i,j,k,l}\) 表示i-j区间之内的k-l的值域或者什么的,并且转移的时候k和l可以从k+1,l;k,l-1继承过来以减少复杂度
很多的dp是可以用段数表示状态的,然后往里放数字合并或者新加段
有的dp方程满足单调性可以用双指针单调转移
很多dp都不需要通过下标转移,一个状态可以表示这个状态的,类似于笛卡尔树dp?
本质不同二叉树个数为卡特兰数,不是阶乘……
二分答案!!!二分答案!!!要记得!!!
中位数一类的东西可以二分之后和>=0
不支持合并的树上问题可以考虑转成 \(dfn\) 序上 \(dp\)
在树上进行dp连通块的时候可以转成在dfs序上面进行dp,每次选一个节点就转移过去,如果不选择合格节点就跳过一整个子树 HDU6643
有的时候状态是可以被优化的,不要直接去存一大堆数字进去,那些数字可能有共同特点,比如在某个区间内,距离为 \(2^k\) 我希望你们永远不要用到的洗牌法
类似区间的加法也可以 \(pushdown\) 3.26T3
\(popcount\) 的连起来是把当前东西取反之后放到后边重复一遍,并且一个这个东西的区间可以在线段树上面变成一些区间,这些区间只有长度和正反的区别,也就是说本质不同的区间只有 \(2\log n\) 种 3.26T3
有的东西在容斥的时候可以通过dp来求出容斥系数 抽鬼牌
如果是什么相邻差值的和,可以先枚举值转化为 \(01\) 序列之后考虑所有的相邻不同个数 Permutation on Tree
如果一个 \(dp\) 是多项式的形式,可以通过把若干个点值求出来之后拉插优化 CF1874E Jellyfish and Hack
树形dp的时候换根一定要记得自己处理数组的先后顺序,比如两个数组都会变的情况,要先用临时数组存储起来再进行递归
一般来说,分拆数并没有很大,可以用来优化状态
一些条件需要满足区间最大小值一类的可以用 \(cdq\) 分治优化转移 ARC159F
有的概率题一些东西的概率非常小对于精度来说可以忽略不计,可以直接扔掉
如果对于一个问题来说,它的区间互相不包含的问题好做,那可以每次找到不互相包含的最大的区间做一遍,然后删除最大的区间依次找到剩下的可以加入的区间进行求解 2264. 【2024河北省队集训Day2T1】集合
总 \(dp\) 状态有用的位置可能很少,其他无用的位置可以快速算出贡献 CF1119F Niyaz and Small Degrees
如果一个序列,不能单点减一,只能区间减一,那么能被消成全 \(0\) 当且仅当每个位置都 \(a_i\le a_{i-1}+a_{i+1}\) CF1943D2 Counting Is Fun (Hard Version)
容斥的时候可以通过记录 \(-1\) 的次数的奇偶性,将这个奇偶性作为 \(dp\) 状态来计数 CF1943D2 Counting Is Fun (Hard Version)
凸的树形 \(dp\) 可以用闵可夫斯基和维护 \((min,+)\) 卷积,或者 \(slope trick\) P9962 [THUPC 2024 初赛] 一棵树
有关最大值最小值的 \(dp\) 可以考虑在笛卡尔树上面进行 \(dp\)
数学
两个数的gcd一定小于等于他们的差
鸽巢原理!!!一定记住!!!
容斥:
小星星:如果说是一个排列,那么我们可以枚举点集为可以出现的点集,那么直接容斥就好了
概率:
如果说是一些出现或者不出现的东西,那么他们和的期望就是概率之和(权值为1
我们有时候可以把概率转化成一个左右两边转移过来的形式,那么我们有时候可以直接移项转成递推,也可以带状矩阵高斯消元
一个数字是可以用k个根号n和j个1拼出来的(k和j都小于等于根号n
当然还可以用二进制拼出来
一个东西的几次方在组合意义上面可以表示成取多少次然后相等
有的时候一些乘法的东西可以转化成log之后相加
有时候一些多项式的东西可以求导
枚举质数的时候一定要记得判大于等于根号的时候就可以停下来了啊啊啊啊啊啊
一定要记得break!!!!!!!!
凸函数加凸函数还是凸函数
如果一个连续函数满足:\(f(x1)+f(x2)\le f(\frac{x1+x2}{2})\) 说明这个函数是个凸函数(琴生不等式)
左右移的时候记得转换类型
对球的颜色序列计数,只需要考虑,对于每一个颜色序列,判断它是否可行。
线段树一个节点的两个儿子的对应位置只有一位不同CF1556G
拉格朗日插值的时候一定要记得是 \(\sum_{i=1}^n y_i\prod_{j\not = i}\frac{x - x_j}{x_i - x_j}\),前边是加后边是乘!!!!
多项式牛顿迭代的时候 \(F(x) = F_*(x) - \dfrac{G(F_*(x))}{G'(F_*(x))}\) 的分子的前 \(\frac{n}{2}\) 项全部是 \(0\),所以分母只需要处理出前 \(\frac{n}{2}\) 即可
幂级数的欧拉变换:\(\varepsilon(F(x))\) 表示我们要将大小为 \(n\) 的无标号物品分成若干非空组,如果大小为 \(k\) 的组内部有 \(f_k\) 种方案的分组方案数 \(\varepsilon(F(x)) = \prod_i\dfrac{1}{(1 - x^i)^{f_i}}\) 无标号无根树计数
单增单减这种东西可以转化成折线图的形式然后 \(LGV\) 引理直接做 gym102978A Ascending Matrix
求一些恰好可以转为至少之后变成01序列
如果每一步可以往右上,右,右下走一步,往右的情况有两种,问到达 \((x,y)\) 的方案数就是 \(\binom{2x}{x+y}\),所求即为:\([t^y] (\frac{1}{t}+2+t)^x = [t^y] t^{-x}(t^2+2t+1)^x = [t^{x+y}] (t+1)^{2x}\)
不越过一条直线的路径可以用类似卡特兰数的方式解决
范德蒙德矩阵的行列式是:\(\prod_{i<j}(b_j - b_i)\)
计数一些关于绝对值的东西的时候可以通过枚举一个值转化成 \(01\) 序列之后求相邻的 \(01\) 的个数 ARC176D
\(DAG\) 计数的时候可以每一次钦定若干入度为 \(0\) 的点然后容斥,要记得容斥系数是 \((-1)^{|S|-|T|+1}\) 证明在第三个题的题解上面 省选2024重塑时光 ABC306EX CF1466H Finding satisfactory solutions
一个数的前半部分的位已经确定了之后就可以确定前半部分是这些位的完全平方数是多少
一个完全平方数知道前 \(k+2\) 位便可以递推出他的平方根
多维度的东西可以考虑数形结合用矩形或者立方体等转化为格路问题
\(atan2\) 函数可以计算 \((0,0)(x,y)\) 的夹角
计数的时候看着难做的东西可以转成映射去做 [AGC035F] Two Histograms
再用信息的角度考虑问题,去考虑本质不同的信息个数 CF643F Bears and Juice
组合意义天地灭:将当前的权值转化成组合意义的方案数和 [AGC039F] Min Product Sum
格路计数的时候考虑第 \(i\) 列到第 \(i+1\) 列的时候纵坐标是多少:
\(\binom{n+m}{m} = \sum_{j=0}^{m}\binom{i+j}{j}\binom{n+m-i-j-1}{m-j}\)
转移成等价的形式的时候,可能对于求和的时候会变得更快,比如将两维调换时可能可以 \(O(1)\) 将当前式子转移到别的式子 P8367 [LNOI2022] 盒
计数的时候可以将若干步的计数转化成先计数满足第一个条件之后减去满足第一个条件但是不满足第二个条件的方案数CF1667E Centroid Probabilities
当所有的点父亲都小于自己时,\(j\) 在 \(i(i\lt j)\) 子树内的概率是 \(\dfrac{1}{i}\) CF1667E Centroid Probabilities
对笛卡尔树进行计数的时候可以考虑二叉树转多叉树,建虚根之后递归,把每个点的右儿子变成自己的兄弟,这样从根到叶子的深度就是从根到叶子的向左跳的次数 【集训队作业2018】count
每个区间的最大值相同相当于是笛卡尔树同构 【集训队作业2018】count
有的题可能有若干次操作,可以转化为先进行一部分操作之后将另一种操作插入到原操作序列中,这种一般形如第二个操作进行计数时需要将 \(dp\) 的维度多加一维的样子 [AGC040F] Two Pieces
有关若干个同类型东西合并起来的时候可以考虑用 \(EGF\) 卷起来,因为 \(EGF\) 本来就是若干个相同类型的东西组合起来成类似多重集排列的东西 P5333 [JSOI2019] 神经网络
在强制规定一些东西的顺序的时候,可以让其不参与 \(EGF\) 的组合合并,在合并完成之后插入到对应的位置上面,这种时候多项式的次数也要减一 P5333 [JSOI2019] 神经网络
任何有关多个东西不相交的东西并且要求方案数第一时间想 \(LGV\) 引理,并且 \(LGV\) 引理有时候可以用状压 \(dp\) 的方式进行计算行列式 [ABC216H] Random Robots
小范围的计数可以考虑用贝尔数来进行划分集合之后判断
回文串可以推出若干对相等条件,可以通过这个把字符集合划分出来之后进行计数 CF1569F Palindromic Hamiltonian Path
若干个不交的东西乘起来合并的时候可以直接将容斥系数乘起来
圆上两点连边相交的题目,每个连通块都是一个区间(两个端点都在连通块中),只不过区间内部可能会有小的连通块,可以对这个东西进行求解 [AGC028D] Chords
对多个东西形成一个块进行计数的时候可以考虑容斥,用总方案数减去前面第一个块乘上后边随便选的方案数,比如无向连通图计数这种 P4841 [集训队作业2013] 城市规划 [AGC028D] Chords
在面对一些 \(k\) 次方的形式的计数时候,有一些方法:通过转组合意义变成选多少个相等: P1758 [NOI2009] 管道取珠 通过斯特林反演将其转化为组合数的形式(这个一般在幂次固定且比较小的时候比较常用):CF1097G Vladislav and a Great Legend 维护各个次方和的形式,然后利用二项式定理进行合并 (暂时没想起来题,但是这个很典)
有上下界的题目可以通过对一些位置强制选下界来容斥变成只有上界的题目 [AGC036F] Square Constraints
对于那些在一定范围内可以平移一类的题进行本质不同的计数时候,可以考虑多设一维表示当前是不是已经经过最小值 \(0\) 来做 [AGC013D] Piling Up
一些看上去会重复的东西(虽然确实会重复),可以考虑一个方案被算了多少次,如果有一部分方案数都被算了同样的次数就可以直接除掉 CF512D Fox And Travelling
很多本质不同的方案数在 \(dp\) 的时候往里面加入需要用组合数进行插板,算出加入多少个这个类的方案数,这样不会因为相同的方案而计算重复 CF848D Shake It!
一些有关 \(1\) 的个数前面要有 \(0\) 的限制条件,可以将其转成 \(+1,-1\) 之后进行格路计数,大部分情况都是可以卡特兰数解决的 [AGC021E] Ball Eat Chameleons
\(n\) 个数选 \(k\) 个,相邻的不能同时选的方案数是 \(\binom{n-k+1}{k}\)
有时候一些比较弱的问题可以通过加强限制,转化成更好做的问题之后,将符合限制和不符合限制的方案数加起来等等来做,比如将序列问题转化为环问题 [ARC120F] Wine Thief
序列问题转到环上是非常厉害的一个技巧,我们可以在序列问题中一个位置强制不可取或者必须取的时候将序列拼成环来进行计数,转到环上之后每个位置就都是等价的,概率也都是一样的就可以直接进行除法,只不过需要处理一些边界情况,比如序列两端拼接的时候会产生一些重复或漏掉的计数,减去(加上)即可 [ARC120F] Wine Thief CF1528F AmShZ Farm
对于某些东西需要按顺序合并的题目,可以将他们看成若干个二元组之后将其凸包一类的东西建出来(说一类是因为有可能上树),就是如果当前东西可以被选,他后面比自己小的数会立即被选择,那么我们直接将这两个东西合并之后一起选择即可 2261. 【2024河北省队集训Day1T1】Bitset 大师
CF1450H2 Multithreading (Hard Version)
环上相同的东西可以相互抵消的这种东西可以分奇偶性进行黑白数量的计算,因为奇偶性不会改变 CF1450H2 Multithreading (Hard Version)
图论
一个图的dfs树没有横叉边,一个图的bfs树没有返祖边
满流并且在残量网络中找不到x到y的路径(即x,y在残量网络中不在一个SCC中),那么就是最小割的可行边
满流并且残量网络中源点能到入点并且出点能到汇点,就是说入点和源点在同一个SCC,出点和汇点在同一个SCC
强连通分量:low[x]==dfn[x]
无向边(x,y)是桥,当且仅当搜索数上存在 x 的一个子节点 y,满足:dfn[x] < low[y]
点双是:dfn[x]<=low[y],不需要记录栈和vis数组
dfs栈出栈的时候有vis的情况下要清空vis(比如SCC)
点分治记得把rt设成0
所有生成树的边权和可以把一条边的边权变成 \(ax+1\) 的形式,a是边权,然后跑矩阵树定理求出来的多项式的一次项系数就是答案
如果进行拓扑排序的话,对于一个图,将其缩点之后得到的新编号的逆序就是一个拓扑序
换一种说法就是,建出原图的反图,然后枚举 \(1\rightarrow n\),如果当前点没有被访问过就以其为起点在反图上 \(dfs\),最后回溯的顺序就是拓扑序。CF798E
如果不是计数问题,那么可以考虑把维护数量转化成维护最值(同上一个题
dij在一些情况下可以规定或找出转移值的大小 CF605E
拆分法可以将两个东西的影响拆到一个点上CF516E
很多点但是只有一部分点有用的情况下可以只把有用的点拿出来做(同上一个题)
在考虑连通性的同时还需要知道连通性有没有递进关系,就是说如果A能到B,B能到C,A能不能到CCF1307F
在需要确定一个东西满足什么条件的时候,可以慢慢的把条件收缩之后求出满足当前条件的集合,然后在最后的集合中找到一个合法解输出出来CF1142E
很多时候一些限制是相加减的但是看着并不是很好看,这时候我们可以选择将一些东西取相反数,可能会得到意想不到的效果,比如转化成差分约束省选联考2021矩阵游戏
在有环的图上进行博弈时,可以考虑拓扑排序,如果一个点没有后继状态就是必败,一个点有一个必败的后继状态就是必胜,一个点所有的后继状态都是必胜就是必败,否则就是平局abc209e和过河卒
我们在进行一些序列上的删除操作的时候可以采用并查集loj2391港口设施
上面那个题是将一些区间进行了重标号,按照左端点从小到大标号的,在遇到一个左端点的时候加入这个区间,遇到右端点的时候区间连边,并且将这个区间删除(也就是在并查集上和下一个位置连起来)(我们规定所有 \(fa_i = i\) 的地方表示这个点是没有被删除的),也就是说现在所有没有被删除的区间里编号比当前区间大的区间都可以进行连边,那么我们一个个连边之后一个个删除即可
拓扑排序时队列里所有的点都是不可以互相到达的,并且队列里现在的点一定可以到达 之前未到达过的所有点CF1062F
修改一个点到根的路径的时候可以考虑LCT,只是access的时候要注意维护上一些东西而已CF1137F,树点涂色
如果以重心为根,每一个点的 \(siz[v]<n-siz[v]\) ,也就是说v的父边两端点 \((u,v)\) 中v的子树内点更少CF1396E
同样是上一个题,我们要构造出一个完美匹配使得每一对匹配的距离之和最大,我们只需要以重心为根之后,让dfs序上i和i+n/2匹配即可,因为i和i+n/2绝对不是一个子树内的,且所有路径都经过重心CF1396E
如果把树上的直径求出来,设 \(f_x\) 为x距离最远的点的距离,以 \(f_x\) 最小的点为根,从上往下 \(f_x\) 会递增
两个点集的直径可以合并,合并之后可以线段树ZJOI2007捉迷藏
一棵树上选出k条路径要求这k条路径的虚树最大,可以转化为选2k个叶子,然后再转化为一定选直径上一个端点,因为如果直径上一个端点都不选的话,扔掉一个叶子选直径上一个端点肯定更优CF526G
网络流的时候并不是所有结束点都连汇点,起始点都连源点 餐巾计划问题
网络流的时候可以用最小割来处理矛盾,一条边被割掉就相当于这条边的条件不满足 善意的投票
网络流在有的点暂时没有用的时候就可以先不建,直到需要用的时候再建出来,也就是《动态开点网络流》,奇奇怪怪 美食节
一些时候有的限制是没有用的,比如要求边权和,但是有一些到达的限制,我们完全可以在当前方案中构造出满足条件的顺序计算答案,而不需要考虑到达的限制,因为一定有一种方案满足条件 ZJOI2011营救皮卡丘
网络流可以进行对一条边的退流操作:\((u,v)\) 上的流想要退掉可以让 \(u\rightarrow S\) 跑一遍最大流之后 \(T\rightarrow v\) 再跑一遍最大流,然后将 \((u,v)\) 正反向的流量都置成 \(0\) 或者想要的值 北京省选集训2019 图的难题
我们可以通过限制最大的流量的方式来强制让所有条件都满足条件,假定一个条件不满足就一定不满流:AHOI2014/JSOI2014 支线剧情
网络流在描述矛盾的东西的时候可以用串并联的方式进行连边,这样一条流是不会经过并联的两条边的 最长k可重线段集问题
加减的不等式关系可以用循环流量抵消 \(+\) 上下界网络流来完成。CF1288F
一些矛盾可以用网络流染色来刻画 P3756 [CQOI2017] 老C的方块
强连通图可以耳分解 Economic One-way Roads
在树上需要进行判断大小来决定先后顺序的时候可以先求出最优的地方然后将其和父亲并查集并起来表示父亲选了之后立马选它
在一些判定问题上,如果形如完美匹配可以考虑 \(hall\) 定理 ARC106E Medals
在遇到一些值域取 \(\max,\min\) 的时候可以建出来值域个点,然后跑最小割,割掉的边就代表选了的值域 ARC176E
对整个序列进行操作,比如和另一个序列取 \(\max\),可以建图跑网络流最小割,运用上面的思路将对应左右点连起来,因为跑最小割,所以能够到达这个点的只有 \(S\) 或者 \(T\),只需要将一个限制放在 \(S\) 方,另一个放在 \(T\) 方即可 ARC176E
求前 \(k\) 大的时候进行 \(dfs\) 的时候每次进行 \(dfs\) 都可以搜到一个解,所以进行 \(dfs\) 的时候复杂度是 \(O(k)\) 的,\(k\) 是总方案个数
平面图可以用不超过四的颜色来染色(四色定理)
平面图最小割可以转化为对偶图最短路,因为平面图的割相当于对偶图的环,将对偶图中最外边的面拆成两个点,求这两个点的最短路就是平面图的最小割 狼抓兔子
网络流建值域点的时候可以将每个值域点都向 \(T\) 连一条流量为 \(1\) 的边,这样值域改变1都会让代价变化 \(1\)
平⾯三⾓剖分图可以三染⾊,当且仅当所有奇度数点均在边界上。
一些需要在区间中选出一些东西的限制可以通过前缀和转化为差分约束问题
哈密顿路或者回路的问题可以考虑将原来的图拆分成为若干条链之后做 P5333 [JSOI2019] 神经网络
md路径问题一定要往点分治上面想啊!!!!!!!!!! 2261. 【2024河北省队集训Day1T1】Bitset 大师
树上贪心一定要自底向上 P8341 [AHOI2022] 回忆
奇奇怪怪的连通性问题就去想最小生成树 6.24模拟赛T1
字符串
子串和子序列是不一样滴
后缀树可以SAM构建,SA想不到的题可以用后缀树想
manacher 和 exkmp 的时候记得和边界取min
SAM记得开两倍点空间,三倍边空间
string在用scanf输入的时候需要预先分配空间
序列上面 \(\mod k\) 相同的位置可以用权值乘 \({i\mod k}\) 来哈希,然后直接判断
若干字符串进行排序的时候不一定要用后缀数组也可以用 \(trie\)
类似回文的东西都可以考虑用 \(manacher\) 算法解决 6.24模拟赛T2
计算几何
构造
对于这种构造可行解使得权值和恰好为某一值的题,一般都是先求出可以构造出来的最大和最小值,然后从某个极值按照一定方法进行连续修改CF1396E
构造的时候可以先求出最大值的情况之后,让一部分值进行调整,剩下一部分值用最大值CF1396E
如果是每个点都有一些限制一类的,可以考虑一些特殊情况,有时会有极强的限制,就可以构造出一些必定存在的东西,剩下的可能会有别的做法 CF566E
有时候有的东西是等价的就可以缩起来,或者把等价的东西用一个代表点代表出来,代表出来之后可以让所有的限制都包括至少一个代表点 CF611H
构造的时候可以考虑建立双射,有的时候会有东西的方案数和想求的东西方案数一样,这种时候直接建立双射就很对 帽子
序列上的构造问题大部分可以用归纳构造来解决 CF1698F Equal Reversal
构造的时候可以通过递归来进行最小次数和合法性的构造 P6892 [ICPC2014 WF] Baggage
博弈论
进行一些博弈的时候如果有无用的东西可以将它删掉之后进行若干归纳证明(比如删除边界的点)
其他
特殊性质可以启发正解
一些选多少段的问题可以采用反悔贪心,比如不能选相邻的东西 2265. 【2024河北省队集训Day2T2】划分
二分的复杂度会比 \(check\) 多个 \(log\),那么我们可以在对很多个位置进行二分求出最终答案的时候随机打乱,如果当前位置已经比答案劣了就可以直接跳过,这样只会进行 \(log\) 次二分
计数题将所有的 \(int\) 换成 \(unsigned int\),所有 \(long long\) 换成 \(unsigned long long\) 会快好多


打表打表打表,不会做了记得打表!
一些判断类的东西可以用哈希
平面最近点对可以用分治搞,平面最小周长三角形就可以对 \(\frac{ans}{2}\) 进行分治
一些处理点对贡献的东西的时候可以采用分治,还有dp什么的
有的东西直接搜索的复杂度就是对的,因为拓展的次数有限,只要搜索到的地方就一定是合法的
在代数一类的东西的时候,如果算出来一个东西一定要带回去验算一遍!

位运算一定要记得加括号!!!!!!!比如:\(!s&(1<<i)\) 和 \(!(s&(1<<i))\) 是不一样的
向量点积可以想余弦定理,共线考虑斜率相等
当不用求出具体值,只用求总和时,考虑贡献法。图函数
memset慎用!如果用memset清空一部分位置的值的时候要找对sizeNOI2018情报中心
双模哈希一定要写对啊
复制粘贴一些东西的时候一定要记得改正……比如什么函数名变量名一类的
初始化
(记得开long long!!!!!!!!!!!!!!!!!!!!!!!,数组要开大!!!!!!!)
取max,min的时候记得转化成相同类型取
变量不要和关键字重复
要记得测极限数据看会不会TLE或者RE
记得特判一些特殊情况比如除0一类的东西
写题之前要先在草稿纸上面把步骤写下来,千万不要忘记步骤,就算是小步骤也不要忘……
好好看题
字符串转化成数字的时候要注意(有的时候字符集比较大)
哈希如果没时间写双模数哈希了可以求稳写双base
题目中给定的n和m不要写反
1e18以内的因数个数很少只有1e5
做不出来的题可以打表找规律
运算记得加括号,不确定的优先级一定要记得加括号
不要用endl!!!!!!!!!!!!!!!!!!会TLE!!!
string 类型s两种操作:s = s+'a'(复杂度O(N))s+='a'(复杂度O(1))
生成数据的生成器不需要输入的时候可以多用几遍……
三目运算符比if快到不知道哪里去了……我本地if2.5秒,三目运算符1秒……
\(shrink_to_fit\) 可以释放 \(vector\) 的空间

浙公网安备 33010602011771号