Codeforces Educational Round 177 Div. 2 【B题,C待补
B 二分
题意
样例
5 3 10
3 4 2 1 512
找最右边的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;}