A. 小P的2048

简单模拟。

 

 

B. 小P的单调数列

首先有一个简单的dp。

设$dp_{i,j}$表示已经选择的最后一个是第$i$个数,已经有了$j$个单调段。

转移并不困难,简单数据结构维护一下可以做到$O(n^2logn)$

然后发现这个dp的第二维其实可以省去。

二分答案,那么增加单调段的时候减掉二分的值即可。

这样可以$O(nlog^2)$,其实应该可以通过。

然而正解只有一个log。

结论是:一定存在一个答案,只有不超过两个单调段。

其正确性是显然的。

设存在第三个段,那么有两种情况:

第三个段的值大于等于前两个段的平均值,那么前两个段没有必要。

第三个段的值小于前两个段的平均值,那么可以删掉第三个段。

同理更多的段也是没有必要的。

所以只要正反求最长上升子序列。

注意离散化已经$unique$后,数组大小不再是n,不要因此挂分。

 

 

 

C. 小P的生成树

一道很好的生成树题。

利用的思想大概是:

在一段区间中所有边的大小关系是确定的,那么可以将这一段区间中选出一个代表元素。

然后求出生成树即可。

具体来说,

当我们已经知道最大生成树的最终和,

问题转化为如何使给定的边在该向量上的投影最大。

然而这个向量可能有很多,无法枚举。

于是考虑对于每个范围只枚举一个,因为每个范围中,所有边的大小关系确定,那么可以算出最终答案。

枚举两条边,那么可以求出使这两条边投影相同的两个向量,将这些向量用角表示出来。

对这些角排序。

取相邻两个角中间的角,视作该区间的代表元素,算出一组答案,并尝试更新最终答案。