题意
这个游戏是这样的,你有一个初始序列
S
S
S ,你每次可以选择一段任意长度的连续区间,把他们
+
1
+1
+1 再膜
k
k
k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列。作为一名优秀的OIer
,您认为这个游戏十分naive
,所以您打算撸一个游戏脚本来取到最优解。
n
≤
1
e
5
,
k
≤
100
n\le1e5,k\le100
n≤1e5,k≤100
题解
因为是区间
+
1
+1
+1问题,又要使次数最少,故考虑差分。记
a
i
a_i
ai为原数经过多少次可变成目标数,
b
i
b_i
bi差分数组。若不考虑取模,则贪心地算,答案为
∑
m
a
x
(
b
i
,
0
)
\sum\ max(b_i,0)
∑ max(bi,0)。
那么考虑取模的影响,就是将一段区间加
k
k
k次后结果不变,即将
b
l
+
k
,
b
r
−
k
b_l+k,b_r-k
bl+k,br−k后仍然满足。考虑贪心地执行一系列这样的操作,使答案最小。发现只有
b
l
<
0
b_l<0
bl<0时加
k
k
k才可能减小答案(若
b
l
>
0
b_l>0
bl>0,则会对答案增加
k
k
k,而对后面不可能减少
k
k
k),而当
b
r
>
0
b_r>0
br>0时才能减
k
k
k(否则无用)。而一个加与一个减要一一对应,故将加的存进桶中,对于减的,在桶中查询能最大程度减少答案的值,然后再把本来的
b
i
b_i
bi放入桶中,因为这样的操作不一定最优,放入桶中相当于给后面的一次反悔的机会,这样答案就最优了。