1 条题解

  • 0
    @ 2023-8-30 17:01:00

    先与处理好

    long long height[MAXN + 5]; // 第 i 级台阶的高度
    int need[MAXN + 5];         // 要踏到第 i 级台阶需要的最小步长
    

    递推式非常显然

    height[i] = height[i - 1] + a[i];
    need[i] = max(need[i - 1], a[i]);
    

    然后就简单了。当然这题也可以离线询问然后用双指针,但是没有必要。

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 200000;
    const int MAXQ = 200000;
    int t;
    int n, q;
    int a[MAXN + 5];
    int k[MAXQ + 5];
    long long height[MAXN + 5]; // 第 i 级台阶的高度
    int need[MAXN + 5];         // 要踏到第 i 级台阶需要的最小步长
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> t;
        while (t--)
        {
            cin >> n >> q;
            for (int i = 1; i <= n; i++)
                cin >> a[i];
            for (int i = 1; i <= q; i++)
                cin >> k[i];
            // 预处理 height、need
            height[1] = need[1] = a[1];
            for (int i = 2; i <= n; i++)
            {
                height[i] = height[i - 1] + a[i];
                need[i] = max(need[i - 1], a[i]);
            }
            // work
            for (int i = 1; i <= q; i++)
            {
                int pos = upper_bound(need + 1, need + n + 1, k[i]) - need;
                if (pos == 1)
                    cout << 0 << " ";
                else
                    cout << height[pos - 1] << " ";
            }
            cout << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1319
    时间
    3000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    20
    已通过
    6
    上传者