社长选举
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

SIT算法竞赛社的年度社长选举开始了!今年共有 n 名候选人,编号为 0n-1,每位候选人的竞选能力值用数组 A 表示。

候选人zcf也想参选社长,但他发现选举规则很特殊:选举前需要选择一个旋转参数 K,将候选人名单循环右移 K 个位置。在新的序列中,每位候选人如果满足能力值 ≤ 当前位置索引,就能获得1分。

zCF希望选择一个合适的 K,使得选举的总得分最高,这样他当选社长的机会更大。请你帮他找出这个最佳的 K

给定长度为 n 的数组 A,表示候选人的能力值。定义旋转操作为:将数组循环右移 K 位,得到新数组: A[k], A[k+1], ..., A[n-1], A[0], A[1], ..., A[k-1]

在旋转后的数组中,对于位置 i(0 ≤ i < n):
如果 A[i] ≤ i,得1分
否则得0分

请找出能获得最高总得分的旋转指数 K。如果多个 K 都能获得最高分,返回最小的那个。

输入描述:

第一行:整数 n (1 ≤ n ≤ 10⁵) 第二行:n 个整数 A[0], A[1], ..., A[n-1] (0 ≤ A[i] ≤ 10⁵)

输出描述:

输出获得最高得分的最小旋转指数 K
示例1

输入

复制
5
2 4 1 3 0

输出

复制
0

说明

原始数组:[2, 4, 1, 3, 0]

  • K = 0[2,4,1,3,0] → 得分3(位置2:1 ≤ 2;位置3:3 ≤ 3;位置4:0 ≤ 4)

  • K = 1:[4,1,3,0,2]` → 得分3(位置1:1 ≤ 1;位置3:0 ≤ 3 ;位置4:2 ≤ 4)

  • K = 2`[1,3,0,2,4] → 得分3(位置2:0 ≤ 2;位置3:2 ≤ 3 ;位置4:4 ≤ 4)

  • K = 3:[3,0,2,4,1]` → 得分3(位置1:0 ≤ 1;位置2:2 ≤ 2 ;位置4:1 ≤ 4)

  • K = 4[0,2,4,1,3] → 得分3(位置0:0 ≤ 0;位置3:1 ≤ 3 ;位置4:3 ≤ 4)

最高得分3,最小 K = 0。