1 条题解

  • 0
    @ 2025-8-3 16:26:27

    O(n)O(n) 差分

    用差分算出每个房子经过的次数,计算出每个房子路过的花费,比较购买花费和路过花费选择更小的加入答案。

    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int N = 1e5 + 10;
    
    long long n, p[N], a[N], b[N], d[N];
    
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> p[i];
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        for (int i = 1; i <= n; i++)
            cin >> b[i];
    
        for (int i = 1; i <= n; i++)
        {
            int l = min(p[i - 1], p[i]), r = max(p[i - 1], p[i]);
            if (p[i - 1] == l)
            {
                d[l + 1]++;
                d[r + 1]--;
            }
            else
            {
                d[l]++;
                d[r]--;
            }
        }
        d[p[n] + 1]++;
        d[n + 1]--;
    
        long long res = 0;
        for (int i = 1; i <= n; i++)
        {
            d[i] += d[i - 1];
            res += min(a[i], b[i] * d[i]);
        }
        cout << res;
    
        return 0;
    }
    
    • 1

    信息

    ID
    483
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    31
    已通过
    3
    上传者