题目传送门:https://codeforces.com/problemset/problem/1168/A
题目大意:
给定一串长度为\(n\)的序列\(A\),每次操作可以选取任意\(k\)个数\(i_1,i_2,...,i_k\),满足\(1\leqslant i_1,使\(A_{i_j}\)变为\((A_{i_j}+1)\%m\)
问最少多少次操作后,可以使序列\(A\)变为单调不降序列
考虑二分操作数\(\alpha\),因为每次可以选取任意个数进行操作,所以每个数的操作次数都是 \(0\sim \alpha\) 且相互独立。
我们可以记录上一个数的值 \(Last\) ,显然\(Last\)越小答案不会更劣,对当前的\(A_i\)而言:
- 如果\(A_i\leqslant Last\leqslant A_i+\alpha\),我们可以直接将\(A_i\)加到\(Last\)即可
- 如果\(A_i>Last\) 且 \((A_i+\alpha)\%m\geqslant Last\),我们也可以将\(A_i\)加到\(Last\)
- 如果\(A_i>Last\) 且 \((A_i+\alpha)\%m,那我们就不对\(A_i\)操作
- 如果\(A_i 且 \(A_i+\alpha,那无论怎么操作都不可行
故直接参考上述条件二分答案即可
/*program from Wolfycz*/
#include