题解:P7287 魔法
思路分析
对于操作 1,显然是在操作 2 之前并且应用于 \([1,n]\)。
操作 2 只应用于和 \(>0\) 的子序列。
显然,问题具有单调性,考虑二分操作 1 的次数,枚举操作 2 的次数,时间复杂度 \(O(n\log^2 s)\)。
代码实现
Code
#include<bits/stdc++.h>
using namespace std;
inline bool check(int x, int k, int n, const vector<int> &A){
int Max = 0;
for(int i = 0; i < n; i++){
Max = max(0, Max + A[i] + x);
if(Max >= k) return true;
}
return false;
}
int main(){
int n, a, b, s;
cin >> n >> a >> b >> s;
vector<int> A(n, 0);
for(int i = 0; i < n; i++) cin >> A[i];
long long ans = LLONG_MAX;
for(int i = 0, x = 1; ; i++, x <<= 1){
int k = (s + x - 1) / x;
long long l = 0, r = 2e9, res = -1;
while(l <= r){
int mid = (l + r) / 2;
if(check(mid, k, n, A)) res = mid, r = mid - 1;
else l = mid + 1;
}
if(res != -1) ans = min(ans, 1ll * i * b + 1ll * res * a);
if(x >= s) break;
}
cout << ans << '\n';
return 0;
}

浙公网安备 33010602011771号