省选模拟60

A. 摧毁图状树

   考虑一个贪心,用一个堆来维护可能候选的点。

   每次取出一个点的时候先判断是否已经被覆盖,如果没有覆盖那么覆盖他和他的k级祖先。否则直接跳过。

  发现复杂度在于叶子节点的数量。可以考虑每次直接加上叶子的答案,然后将其他距离叶子最近距离为k的点加入堆。

  这样的复杂度是调和级数*数据结构的,预处理出来所有k的答案即可。

   覆盖k级祖先的操作可以用线段树+dfs序来完成。

 

B. 排列统计

   毒瘤题,至今没有调出来。

  枚举$x$这个数在位置$y$造成的贡献,令$dp[i][j][k]$表示第$i$次操作,$y$前面有$j$个大于$x$的数,k则是位置y上的数和x的大小关系和x的位置,一共分为五种情况。

  转移极其繁琐而显然,所以不写了。

  

C. 归并排序

  考虑如果一个长度为2的区间错误会造成的影响,可以看做是较小的值变成了较大的值+0.5。

  将每个数的两种情况看成一个区间,那么一个数的答案可以由跨过这个数的区间个数得到。

  那么用树状数组来维护这个过程即可。

你可能感兴趣的:(省选模拟60)