A. 小P的2048
简单模拟。
B. 小P的单调数列
首先有一个简单的dp。
设$dp_{i,j}$表示已经选择的最后一个是第$i$个数,已经有了$j$个单调段。
转移并不困难,简单数据结构维护一下可以做到$O(n^2logn)$
然后发现这个dp的第二维其实可以省去。
二分答案,那么增加单调段的时候减掉二分的值即可。
这样可以$O(nlog^2)$,其实应该可以通过。
然而正解只有一个log。
结论是:一定存在一个答案,只有不超过两个单调段。
其正确性是显然的。
设存在第三个段,那么有两种情况:
第三个段的值大于等于前两个段的平均值,那么前两个段没有必要。
第三个段的值小于前两个段的平均值,那么可以删掉第三个段。
同理更多的段也是没有必要的。
所以只要正反求最长上升子序列。
注意离散化已经$unique$后,数组大小不再是n,不要因此挂分。
C. 小P的生成树
一道很好的生成树题。
利用的思想大概是:
在一段区间中所有边的大小关系是确定的,那么可以将这一段区间中选出一个代表元素。
然后求出生成树即可。
具体来说,
当我们已经知道最大生成树的最终和,
问题转化为如何使给定的边在该向量上的投影最大。
然而这个向量可能有很多,无法枚举。
于是考虑对于每个范围只枚举一个,因为每个范围中,所有边的大小关系确定,那么可以算出最终答案。
枚举两条边,那么可以求出使这两条边投影相同的两个向量,将这些向量用角表示出来。
对这些角排序。
取相邻两个角中间的角,视作该区间的代表元素,算出一组答案,并尝试更新最终答案。