好几天没更新了
题解 #
首先,先定义这个函数,也就是从开始往后连续个数的和。
然后我们证明如果 k 和一个答案那么 2k 也是一个答案:。因此我们从能找到一个大于的答案。
然后我们分类讨论,先考虑的情况。如果 k 是答案,因为,所以 k+1 也是一个答案,因此我们只要判断是不是答案就行了。
最后,考虑,我们需要借助以下前缀和,定义 并且 . 我们需要找到 使得对于所有:
因为,“窗口”之后的所有数字都是,所以上面的不等式可以写成这样:
对于每一个,对应的 k 是,也就是说不等式左边的最大值如果小于,那么是一个答案。
Code #
#include <bits/stdc++.h>
#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define all(x) (x).begin(), (x).end()
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<ll> a(n);
forn(i, (n + 1) / 2) {
cin >> a[i];
}
int x;
cin >> x;
for (int i = (n + 1) / 2; i < n; i++) a[i] = x;
vector<ll> ps(n + 1);
partial_sum(all(a), ps.begin() + 1);
if (ps.back() > 0) return cout << n, 0;
if (x >= 0) return cout << -1, 0;
ll N2 = n / 2, N1 = n - N2, sum = ps.back();
ll mx = -1e18;
for (int i = 0; i <= N1; i++) {
mx = max(mx, ps[i] + x * ll(n - i));
if (mx < sum + x * ll(n - i)) {
cout << n - i;
return 0;
}
}
cout << -1;
return 0;
}