数据结构优化DP
本题重在转化。由于最长公共子序列的下标是一个最长上升子序列,所以我们可以考虑把数字映射成下标,有多个就要倒序把每个值映射成多个不同的值,因为一个数有多种下标都是可取的。
与基本问题相同,但是需要根据长度插入新的值,而且只能使用树状数组/线段树进行优化。注意考虑只记录一种是否会影响答案(根据传递性所以“否”)。
按照(位置,时间)建立坐标系。首先利用参照物转变为人向上走,人任意位置不重要,因为我们求的就是到达每个点的答案,初始位置任意说明每个点都是可达的。然后需要把可以到达当前点的位置用不等式表示出来(即向上走的步数的两倍 \(\ge\) 左右(正负)),然后作图(简单,因为经过当前点,再描出一个点就可以作图了)发现图形对称,而且同时满足就可以保证 \(y\) 小于当前点。就转化成了经典的二维偏序问题。
首先需要发现每次操作右端点都是 \(n\),这样就只需要考虑相邻玉米的大小关系。于是每次考虑最后一个玉米 \(i\) 和上一个玉米 \(a\) 是谁,就是删去了 \([a+1,i-1]\),直接比较长高后与上一个玉米。发现是个三维偏序,一维枚举,两维用二维树状数组。
根据线性DP总结即可,然后关注代价和收益是按照前缀、若干个的区间变化的,以及实现时的小技巧。
这里的路我们是一批一批修的,如果说比如出现修路 \([1,2],[3,4]\) 而没有计算租用 \([1,4]\) 的比赛的收益的话,我们肯定有一种转移是连续修到 \([1,4]\)(更优的可能有的比他大),所以肯定可以算到的。
总结
其实就是偏序,满足 \(j<i,a_j<a_i\) 可以转移,所以很自然的枚举满足一个,数据结构满足一个。
树状数组如果维护最值(单修),维护的是前缀/后缀/前缀子矩阵/后缀子矩阵,如果维护和,那么随意(区修需要两个,还要公式计算,比较烧脑)。
线段树维护区间修改+区间查询。
如果定长其实就是滑动窗口,单调队列优化,但是有特定形式。
有三维就用二维树状数组/树套树。(二维树状数组比一般的树套树简单得多)