5 条题解

  • 0
    @ 2026-5-29 15:56:52

    题解

    思考了一下,只要枚举前缀是否为总和的1/3即可

    void solve() {
        int n;
        cin >> n;
        vl a(n + 1);
        vl s(n + 1, 0);
    
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            s[i] = s[i - 1] + a[i];
        }
        if (n < 3 || s[n] % 3 != 0) {
            cout << 0 << "\n";
            return;
        }
    
        ll cnt1 = s[n] / 3;
        ll cnt2 = 2 * cnt1;
        ll ans = 0;
        ll cnt = 0;
    
        for (int i = 1; i < n; i++) {
            if (s[i] == cnt2) {
                ans += cnt;
            }
            if (s[i] == cnt1) {
                cnt++;
            }
        }
        cout << ans << "\n";
    }
    

    信息

    ID
    513
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    1461
    已通过
    244
    上传者