B 二分
题意
样例
5 3 10
3 4 2 1 5
12
找最右边的L下标即可
思路
二分最靠右的L端点,R端点取最右端(n*k处),找到后,答案就是L的位置(pos),(因为如果pos满足,则pos左边的所有下标都满足
代码
const int N = 2e5 + 10;
LL n,m,k;
LL x;
LL a[N],suf[N];
bool check(LL mid)
{
LL t = (n * k - mid + 1) / n * suf[1];
t += suf[n + 1 - (n * k - mid + 1) % n];
return t >= x;
}
void solve()
{
memset(a,0,sizeof a);
memset(suf,0,sizeof suf);
cin >> n >> k >> x;
for (int i = 1;i <= n;i ++) cin >> a[i];
for (int i = n;i >= 1;i --) suf[i] = suf[i + 1] + a[i];
if (suf[1] * k < x)
{
cout << 0 << endl;
return;
}
if (a[n] >= x)
{
cout << n * k << endl;
return;
}
LL l = 0,r = n * k + 1;
while(l + 1 != r)
{
LL mid = l + r >> 1;
if (check(mid)) l = mid;
else r = mid;
}
if (check(l)) cout << l << endl;
else cout << r << endl;
}