一周总结19.6.17-19.6.21
回到slyz高中部的第一周,感觉一个星期过得好快啊,还想着趁那些dalao不在偷偷多学点,本来以为会很不愉快,但是也挺快乐的。
周一回来把咕了一个月的树剖题给调好了(到底是哪出锅我也记不清了),就开始学平衡树,先看的二叉搜索树(BST),然后是Treap,把板子题打了,之前听说有个叫Splay的,就开始学,学着学着就自闭了,本来对平衡树的旋转就理解的有点乱,再一看那个彻底懵逼了,于是弃疗……
打完平衡树的题(其实都很裸),就往后学dp了,刚开始是区间dp,这个还好,以前也写了一些这方面的题,挺好理解。
接下来是树形dp,刚开始对这种dp方式不太习惯,因为自己没写过递归或者说是记忆化搜索(也不能算是记忆化搜索),但是本质都是从已知往未知转移,只不过树形dp是先到叶子节点(相当于f[1]由f[0]转移过来),这样也就能明白了。
然后是数位dp,一本通给的那道引例好难(自我感觉),自己yy了一晚上,后面的题就都是板子了,主要思想就是从最高位到最低位进行记忆化搜索,把各种状态带上,更新就完事了。
到了状压dp,这个难度不大,对状态压缩一下,变成一串数(通常是二进制),这样二维就变一维了,转移方程也一般是用f[i][j]表示前i个用第j种状态的最优解,转移随便转移就好了。
最后是dp的两种优化方式,第一个是单调队列优化,为了学单调队列,专门跑去写了滑动窗口,单调队列是个很强大的东西,可以在队尾插入和弹出,队头弹出,队头访问,有些转移方程长成fi=max(fj-sj)+si之类的,其中j在一个长度固定的区间,那么中间的max就可以用一个单调队列来维护,时间复杂度就可以降一个方。
斜率优化也不是很难,是对于那些转移方程长成fi=max(fj+si+sj+ti\times tj)这样的,中间有个ti\times tj,那么我们可以把这个化为一个形如y=kx+b的一次函数,其中只含j的项为y,含i*j的项为kx,这里面含i的为k,含j的为x,其他的就是y了,会有很多决策点,它们会长成像凸包一样的东西,当我们将一次函数平移,第一个碰到的点就是最优决策点了,这种题一般会有几种情况:1.k是单调的,决策点有顺序,那么就可以用单调队列维护;2.k不单调,我们要用队列来维护凸包,每次找最优决策点时二分查找,复杂度就多了个log;3.决策点也无顺序,那就要用一些数据结构来维护,比如平衡树。
写完了dp,去数论开了个头,把快速幂和质数给写了写,有的以前自己会,但再看之后再写一遍板子真的有不同的理解,数论一直是自己的弱项,希望下周能学完并有所提高。
来句话鼓励自己QAQ
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步