D题求hack数据
如题,自己测了半个小时了,通过率一直卡在96%,实在测不出来了。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <map>
#include <iomanip>
#include <queue>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
int dx[4] = { -1, 1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
LL n, k;
cin >> n >> k;
vector<LL> a(n + 2);
for (int i = 1; i <= n; ++i) cin >> a[i];
// 假设最大能抽到x,有(0+1+2+...+x)<(k+x+1),化简得(k-2)*(k+1)<2*k
// 不能相等
LL l = 1, r = n - 1;
while (l < r)
{
LL mid = (l + r + 1) / 2;
if ((mid - 2) * (mid + 1) < 2 * k) l = mid;
else r = mid - 1;
}
LL x = l + 1;
vector<LL> preSum(n + 2);
vector<LL> sufSum(n + 2);
LL sum = 0;
for (int i = 1; i <= n; ++i)
{
sum += a[i];
preSum[i] = max(preSum[i - 1], sum);
}
sum = 0;
for (int i = n; i >= 1; --i)
{
sum += a[i];
sufSum[i] = max(sufSum[i + 1], sum);
}
LL ans = 0;
for (int i = 0; i <= x; ++i)
{
ans = max(ans, preSum[i] + sufSum[n - x + 1 + i]);
}
cout << ans << '\n';
return 0;
}
感觉代码还是比较简洁的