【题解】
题意:给定一串长度为n的ai不大于m的序列,要求执行尽可能少的操作:每次选择任意元素ai->(ai+1)%m,使得此序列成为一个非减序列。
思路:显然答案具有单调性,因此选择二分答案,上界为m+1。每次判断运用贪心的思想,优先选择最小的不小于前一个元素的可能值。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int a[maxn],n,m;
int b[maxn];
bool check(int x)
{
b[1]=a[1];
if(a[1]+x>=m) b[1]=0;
for(int i=2;i<=n;i++){
if(a[i]>=b[i-1]){
b[i]=a[i];
if(a[i]+x>=m&&(a[i]+x)%m>=b[i-1])
b[i]=b[i-1];
}
else if(a[i]+x>=b[i-1]) b[i]=b[i-1];
else return false;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int l=0,r=m+1,ans;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)){
ans=mid;
r=mid;
}
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}