题意
有m个点围成一个圈,按顺时针编号为1到m,一开始可以固定一个位置x,每次操作可以往顺时针方向走一步或直接走到x。现在给出n个位置a[1..n],初始时在a[1],第i次要从a[i]走到a[i+1],在x可以任意选择的情况下使总步数最小。
n,m<=100000
分析
考虑走一次,从a[i]走到a[i+1],只有当x位于这条路径上时,我们会选择走x,且离终点越近贡献越大。不难发现这些贡献构成了一个公差为1的等差数列。那么只要二阶差分一下,求出把x设在每个位置上可以减少的步数,然后取个最大值即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long