1 条题解

  • 0
    @ 2025-10-20 9:57:23

    解题思路

    1. 用数组 a 统计每一天实际存入的总金额(若同一天多次存钱,需累加 y)。
    2. 预处理前缀和数组 bb[i] 表示前 i 天的总存款(递推式:b[i] = b[i-1] + a[i])。
    3. 对于每次询问 k,直接输出 b[k](前缀和数组可直接得到前 k 天的总和)。

    通过前缀和预处理,将多次查询的总时间复杂度优化至 (O(n + q))

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    void solve()
    {
        int n;
        cin >> n;
        int a[n + 5] = {0};
        int b[n + 5] = {0};
        for (int i = 1; i <= n; i++){
            int x, y;
            cin >> x >> y;
            a[x] += y;
        }
        for (int i = 1; i <= n; i++){
            b[i] = b[i - 1] + a[i];
        }
        int q;
        cin >> q;
        while (q--){
            int k;
            cin >> k;
            cout << b[k] << '\n';
        }
    }
    signed main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0), cout.tie(0);
        int t = 1;
        // cin >> t;
        while (t--)
        {
            solve();
        }
    }
    
    • 1

    信息

    ID
    1151
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    322
    已通过
    40
    上传者