A
先单步容斥一下,暴力复杂度会坏掉,遍历值域即可。
B
先自然的想到排序,离散化然后差分,发现每次操作其实就是从前到后在差分数组上玩石头。
如果石头数量是 \(1\) 显然玩不了啥,如果石头数量大于 \(1\) 则先碰到这个石头堆的人获得控制权。
假如玩家碰到第一个石头数量大于 \(1\) 的石头堆,那他就能继续 combo 去拿后面石头数量大于 \(1\) 的石头堆,即一直拥有掌控权。
那我们只需要判断拿到第一个石头数量大于 \(1\) 的石头堆是 A 还是 B 就好了。
C
能反复用,考虑构造一个排列 \(2,1,3,...,n-1,n\) ,和一个排列 \(2,3,4,...,n,1\),进行冒泡排序。
实现不考虑好可能会有点复杂。
D
先把原序列转成若干个连续递减段,这样最高得分肯定是递减段数量 \(-1\) 。
最少化挑的数的数量,理想状态下肯定是每个段选一个,如果某一步卡壳接不上下一段了,我们就必须在当前段多挑一个数,相当于同时选出最大值和最小值,来重置递增的下限,这会使总代价 + 1。
为了让卡壳的次数尽可能少,贪心策略显然是每次都在当前递减段中,挑一个严格大于前驱元素的最小值。
由于每个段内部是严格递减的,反向来看就是单调递增,可以直接用二分找到这个最优的转移元素。
更进一步的,由于我们在任何位置的贪心转移策略都是确定且唯一的,这意味着每个状态向后跳,必定会在某一个固定的段发生断裂。
这样我们直接倒序预处理,倍增即可。
