【题解】CF2009G1

前言

  只会做G1 ,但尽量做到最好,除了一开始的排序的O(nlogn),后续处理都是O(n)。可能会对G2和G3有一点点用处。

翻译

原题链接CF2009G1
【题解】CF2009G1_第1张图片
【题解】CF2009G1_第2张图片
【题解】CF2009G1_第3张图片

思路

  直接处理等差数列不方便,但这个等差数列性质特殊,即公差为1。所以在一个等差数列中, a [ i ] − i a[i]-i a[i]i就成了常数列。为了避免出现负数,我们将 a [ i ] a[i] a[i]更改为 a [ i ] + n − i a[i]+n-i a[i]+ni,然后问题转化为将这个长度为 k k k的数列转变为常数列的最小操作次数,易知等价于 k − k- k众数 的数量。

  我们使用滑动窗口,维护所有数量,数量的降序映射数组,和降序数组中数量相同的区间的左右边界。各种映射非常复杂,调了好久,下面举个例子:

  现在数组为 1 , 1 , 2 , 2 , 1 , 4 , 2 1,1,2,2,1,4,2 1,1,2,2,1,4,2
  数量数组为 3 , 3 , 0 , 1 3,3,0,1 3,3,0,1
  降序数组为 1 , 2 , 4 , 3 1,2,4,3 1,2,4,

你可能感兴趣的:(记录题目,算法,c++)