题解: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;
}
posted @ 2026-10-06 12:09  地上飞的鱼  阅读(3)  评论(0)    收藏  举报