总结与心得(持续更新)
不知道为什么,刚学的算法过了2个月就忘得一干二净,我并没有背代码啊,当时学的时候还刷了好多题来着→_→,我是不是大脑能力严重衰退了。
动态规划
单调队列
一般情况下,${dp}$方程可以搞成这样:${f_i=f_j+t_j+t_i}$,只要其中没有变量同时与${i,j}$都有关,那么我们可以用单调队列来做,单调队列里面元素的关键字就是与${j}$有关的东西${f_j+t_j}$。example:生产产品
有些比较特殊的,虽然存在同时与${i,j}$相关的函数,但是这个函数比较简单,使得已经存在在单调队列中元素的相对位置不会因此改变,这样的话我们可以打一个全局标记来处理。example:瑰丽的华尔兹
还有一些比较奇葩的,这已经不属于单调队列优化dp的范畴了。example:cut the sequence
斜率优化
想当年我还写过学习笔记,现在毛都不记得了T_T,斜率优化学习笔记。反正套路都差不多,不过我还是更喜欢从函数的角度去理解斜率优化。
斜率单调。example:特别行动队
斜率不单调。example:购票
横坐标不单调。example:货币兑换
状压dp
插头。插头还是挺简单的,就是一个板子,随着题目的变化稍微修改一下就好。example:Tony's Tour
容斥套着,到了考场也不知道会不会做 ╮(╯_╰)╭。example:局部极小值
数位dp
写成记忆化搜索的形式会好很多,注意该开LL的时候开LL。example:Balanced Number
树
prufer
prufer序列中每个数出现的次数就是它在树中的度数-1。example:明明的烦恼
经常用来做树的计数一类dp。
树分治
点分治。关键是对答案的统计用什么算法和数据结构进行处理。example:Tree
有的时候,一定要小心的就是扫把型的树,如果不对子树进行排序,很容易就会被卡掉。example:重建计划
动态树分治。没什么好说的,也许我没做过什么题。example:开店
树上CDQ。example:购票
树链剖分
树链剖分的性质(一个点到根节点的路径上的轻变不超过$log$条)可能有些奇技淫巧。
最简单的维护树上路径修改查询。example:软件包管理器
dsu on tree。其实就是树链剖分维护启发式合并,在某些情况下特别好写= =。example:天天爱跑步
长链剖分维护合并跟深度有关的信息。复杂度证明:每次合并的次数是这个节点连出的轻边的点所在的重链的大小,那么每条重链最多只会被记录一次,所以总合并次数是$O(n)$。听说还能$O(n)$求lca。example:坑着
虚树
虚树就是只含有查询点以及它们lca的点的树,往往与树形dp一同食用。虚树的题目往往其询问点的总数不会超过某个值,必须要满足在虚树上dp可以降低复杂度。教程?
example:世界树
Link Cut Tree
link的实质是找到父亲,cut时换根是为了搞清楚两点之间的父子关系。带边权的换成点。example:魔法森林
LCT维护可加减子树信息,如果不是可加减的就只能toptree了。注意在轻重边替换的时候同时更新信息。example:共价大爷游长沙
ntr的妙用= =。example:CC某题
一类问题的通用解法,分类维护前缀信息和后缀信息。example:城市旅行
数据结构
KDtree
能不写最好还是不要写吧,轻松被卡→_→,也许可以出奇制胜?如果要写,重新构树是个不错的选择。发现大数据跑不过,多半是剪枝挂了。
平面上最近(最远)点对。example:SJY摆棋子
范围内点权查询,暴力重构。example:简单题
神应用,怒艹一类数据结构题。example:A simple rmq problem
Splay
扣区间$[l,r]$的时候,把$l+1$Splay到根,$r+1$Splay到根的右儿子,然而加了“哨兵”,实际上是$l$和$r$。
rotate和Splay记得要加取地址符。
对区间操作完后记得pushup父亲和根,pushup的时候size记得+1啊啊啊。
example:维护数列
ST表
好像没什么好说的,一些细节想清楚就好了= =。example:超级钢琴
treap
比Splay好写一些树套树方便一些可以持久化。思想还是蛮简单的,随机一个权值保证logn的期望树高。
非旋转版现在还策不清,如果真的考了可持久化treap那我还是早早弃疗吧= =。example:普通平衡树
分块
通常用来优化暴力。
树上分块。example:王室联邦
权值分块。example:dispatching
优化暴力。example:最小公倍数
数据有一些特色的,可以分两类:$ > \sqrt{n}$和$ < \sqrt{n}$,分别处理与复杂度分析,然后基本不等式搞一搞取最优块大小。好像没有什么好的例子。。example:普通计算姬
可并堆
好写好调好理解,代码简短。example:disoatching
链表
双向链表大法好。example:营业额统计
启发式合并
把size小的往size大的里面丢,合并次数$logn$。example:森林
貌似写过的启发式合并都是直接set了=。=
树套树
二维线段树。example:魔幻棋盘
线段树套treap。example:二逼平衡树
树状数组
区间修改。example:poj某题
线段树
呵呵,线段树上各种耍杂技= =。
维护连通性。example:堵塞的交通
扫描线结合。example:Picture
二维线段树。单点修改矩形查询,example:魔幻棋盘;矩形修改单点查询;可以直接标记可持久化,example:树状数组
蜜汁思路。example:基础数据结构练习题
线段树合并。example:CF 666E
超哥线段树。example:robot
区间取最值操作。example:hdu某题
历史最值查询。example:CPU监控
还有个劲(j)爆(b)玩意儿现在都还不懂。example:CF某题
主席树
ntr的妙用= =。example:CC某题
优化网络流连边。example:a+b problem
可持久化数组。example:可持久化并查集
树状数组套主席树。其实是树状数组套权值线段树= =。
数学
BSGS
用来求解$a^x=b~(mod~p)$,所谓大步小步。可能出现无解的情况。example:板子题
多项式乘法
注意数组大小,以及最后除一个$n$。循环卷积注意细节变动。转成整型的时候不要爆了int。板子一套:多项式乘法
求解字符串匹配问题。example:万径人踪灭
预处理$ω$加强精度,任意模数FFT,倍增优化dp。所谓倍增优化,就是$f_i$可以由$f_x$和$f_y$推过来($x+y=i$)。example:CF某题
离散对数NTT,循环卷积,求解原根,倍增优化dp。
所谓循环卷积,就是在DFT回来统计答案的时候,除了加上对应位置$x$上的卷积结果,还要再加上$x+m-1$位置上的卷积结果。example:序列统计
博弈论
当前局面的SG等于后继状态的SG的$mex$,当前游戏的SG等于各个子游戏的SG状态的$xor$。大都是脑洞题,考场上只能看人品了。。
求解SG函数。example:江南乐
暴力求解SG,找规律。example:S-NIM
高斯消元
模意义高斯消元,其实就是除的时候乘个逆元。example:SETI
线性基相关。example:XOR
线性基性质。线性基中每一个可以被异或出来的元素的异或方案数相同(包括0)。example:albus就是要第一个出场
动态构造线性基。example:元素
数学相关dp和组合计数
多推推式子转化一下问题,从不可做变成可做。组合数公式的话大概用格点法推一推?$\displaystyle \binum{n}{m}$表示从$(0,0)$走到$(n-m,m)$的方案。
dp期望或者dp概率通过概率算期望。example:亚瑟王
精度要求不高的,可以估算一下计算的次数。example:CF坦克大战
异或相关dp的正确AC姿势,虽然没有什么普适性。example:Lights
二进制相关dp的正确AC姿势。一般先考虑排列方案最后再除个阶乘会好很多。转移的时候考虑到相等的情况,需要容斥一发。example:facer's chocolate dream
莫比乌斯反演
$mu[i]$,如果i的某个质因子指数大于$1$,$mu[i]=0$;否则,$mu[i]=(-1)^{i的质因子个数}$
推式子的时候一定要小心,把一些东西提前的时候不要忘记乘或者除了个什么东西。
$\lfloor n/i \rfloor$,取值相同的$i$的范围为$[i,n/(\lfloor n/i \rfloor)]$。
用来容斥,很棒棒哦。example:完全平方数
约数个数有一个比较经典的式子。example:约数个数和
线性筛约数和。离线处理约束条件。example:数表
欧拉函数
在线求欧拉函数。example:Longge的问题
一个公式。example:Robot
当$n>2$,$φ(n)$是偶数。example:上帝与集合的正确使用方法
置换
Burnside:对于一个置换$f$,若存在一个着色方案$s$经过置换后不变,称$s$为$f$的不动点,等价类数目为所有置换的不动点的平均值。example:Cards
Polya:假设可以有$k$种颜色,那么一个置换$f$的循环内的元素的颜色必须相同,等价类的数目为所有置换的$k^{循环个数}$的平均值。example:Let it bead
一个是对染色方案考虑,另一个是直接对置换考虑。
数论大合集
费马小定理优化矩阵乘法。example:矩阵游戏
Lucas,费马小定理,中国剩余定理。example:古代猪文
Lucas用的时候要注意特判$m=0$,同时组合数记得特判$n<m$。模数不是质数的Lucas,就用古代猪文中的方法,分解质因数然后CRT合并。
exgcd和CRT最好还是用LL运算,不然怎么挂的都不知道=。=
暴力容斥。example:跳蚤
字符串
AC自动机
没啥好说的。。。板子题:阿狸的打字机
HASH
也没啥好说的。。板子题:火星人
KMP
还是没啥好说的。。可能会有奇技淫巧吧。板子题:动物园
manacher
我已经不记得了。板子题:不知名
trie
异或贪心相关。example:poj某题
trie树合并,跟线段树合并差不多。example:Alice和Bob又在玩游戏
后缀数组
基本的论文二分答案+按照height分组的思想。example:milk patterns
单调栈。example:CS
后缀自动机求后缀树组。example:板子题
双向链表。example:生成魔咒
分割点。example:mrs
后缀自动机
思想
CDQ分治
看起来很强但是很simple的一个玩意儿。
CDQ图分治。example:城市建设
CDQ上树+维护斜率优化dp。example:购票(这题出现频率真高= =)
一道还不错的题。example:共点圆
四维偏序。example:偏序
倍增
没啥好说的,注意边界细节。
神题一道。example:会议中心
倍增优化dp,类似快速幂。example:序列统计
莫队算法
莫队还是挺灵活的,各种升级版本都有= =。
树上莫队。example:糖果公园
在线莫队。其实就是预处理出来n个询问,然后每次读入的询问暴力移左右端点。example:坑
江队。只有插入或者删除的莫队。example:坑
总之在考场上应该也能YY出来吧,一定要注意常数啊,一个小小的细节可能就葬送AC=。=
平面图与对偶图
优化网络流。example:海拔
抠域和点定位。example:平面图(话说看这毒瘤题真的大丈夫?= =)
整体二分
没啥好说的。example:接水果
小技巧
差分求解区间gcd。example:魔幻棋盘
当答案是这种$ans=a/b$的形式,二分答案是个不错的选择。example:最小圈
二分$delta$。example:tree
两个熏肉贪心题。哈夫曼;example:荷马史诗。田忌赛马;example:泡泡堂BNB
图的hash(话说这真的叫hash吗,反正王队长这么说那我就跟风了=。=)。example:DZY loves Chinese
弦图。话说这玩意儿真的会考吗。example:神奇的国度
$O(1)$黑科技double快速乘。如果没记住还是龟速乘吧,写错一点都会GG。example:随机数生成器