模拟测试64

T1:

  根据贪心策略,在价格较小的时候买入,价格较大的时候卖出,获得的价值才会更大。

  每天都可以和之前的一天组成匹配,贡献为差值。

  先用一个小根堆,维护还没有匹配的权值,从前向后扫,若堆顶比当前权值小,则组成匹配,累加差值,并将当前权值插入。

  我们发现,在同一天买入和卖出,等价于这天没有操作。

  也就是说如果连续弹出一段权值,中间的权值实际上没有被弹出。

  我们可以把这些权值插入第二个小根堆里,两个堆同时查询。

  时间复杂度$O(nlogn)$

T2:

  我们可以简单的推出$S_n^m$向四个方向的$O(1)$递推式。

  显然:$S_n^{m+1}=S_n^m+C_n^m$,$S_n^{m-1}=S_n^m-C_n^m$。

  然后考虑上下转移。

  

 

 

   可以看出,向下转移时,除了最后一行,其他组合数的贡献都是自身的2倍。

  所以可以得出:$S_{n+1}^m=2S_n^m-C_n^m$,$S_{n-1}^m=\frac{S_n^m+C_{n-1}^m}{2}$。

  然后莫队即可。

  时间复杂度$O(n\sqrt{n})$。

T3:

  大模拟。

  我们发现,对于任何一个矩形,宽都为一,我们可以选取两端点的上下左右共6个点等效替代这个矩形。

  对于每个矩形,查找这6个点有没有其他矩形即可。

  先将询问离线排序,一行一行加入,用并查集维护连通性。

  开两个vector将横条插入当前行,第一个vector储存竖条的上端点,第二个储存下端点。

  每次将第一个vector的个数累加,并扫一遍在当前行的第一个vector里的矩形,更新上部的关键点。

  同时扫一边上一行的第二个vector,更新下部的关键点。

  答案既是当前矩形个数减去并查集的边数。

  时间复杂度$O(nlogn)$。

posted @ 2019-10-08 16:29  hz_Rockstar  阅读(398)  评论(1编辑  收藏  举报