1 solutions

  • 2
    @ 2025-4-29 20:23:20

    可以先预处理出每个前后缀的可爱值,然后枚举分界点暴力计算即可。 注意50000×50000=2.5×10950000 \times 50000=2.5×10^9会爆intint,需要开 long longlong \ long (最后一个样例);还需要注意可能会出现负 数。时间复杂度 O(n) O(n)

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    void solve() {
        int n;
        string s;
        cin >> n >> s;
        
        vector<int> pre(n + 1, 0); // 前缀1的数量
        for (int i = 1; i <= n; ++i) {
            pre[i] = pre[i - 1] + (s[i - 1] == '1');
        }
        
        int max_product = -1e18;
        for (int k = 1; k < n; ++k) {
            // 左半部分可爱值:1的数量 - 0的数量 = pre[k] - (k - pre[k]) = 2*pre[k] - k
            // 右半部分可爱值:(pre[n]-pre[k]) - (n-k - (pre[n]-pre[k])) = 2*(pre[n]-pre[k]) - (n-k)
            int left = 2 * pre[k] - k;
            int right = 2 * (pre[n] - pre[k]) - (n - k);
            max_product = max(max_product, left * right);
        }
        
        cout << max_product << endl;
    }
    
    signed main() {
        solve();
        return 0;
    }
    
    • 1

    Information

    ID
    1465
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    (None)
    # Submissions
    71
    Accepted
    13
    Uploaded By