关于#n#的问题,如何解决?(语言-c++)

c++
你有一个长度为n的数列,一开始全是0,然后李华在m个区间上按照1,2、3。4……的顺序改变这个区间中的数,求最后的数列。
输入格式
第一行两个数n,m(n、m≤100000)
接下来m行,每行两个数a,b表示区间的开头和结尾

输出格式
n个数,表示最后的数列。
输入输出测试点
输入 #1
5 3
1 3
2 3
2 4
输出 #1
1 4 7 3 0
说明
第一次操作后变成 1 2 3 0 0
第二次操作加上 0 1 2 0 0
第二次操作后变成 1 3 5 0 0
第三次操作加上 0 1 2 3 0
第三次操作后变成 1 4 7 3 0
c++代码(贪心)不超时

#include <iostream>

using namespace std;

int main()
{
    int n, m;
    cin >> n >> m;

    int *arr = new int[n]; // 动态分配内存
    for (int i = 0; i < n; i++) arr[i] = 0; // 初始化数组

    for (int i = 0; i < m; i++)
    {
        int a, b;
        cin >> a >> b;
        for (int j = a; j <= b; j++) arr[j - 1] += j - a + 1; // 输入区间,累加数组
    }

    for (int i = 0; i < n; i++) cout << arr[i] << " "; // 输出

    return 0;
}

【以下回答由 GPT 生成】

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;

    vector<int> nums(n, 0); // 初始化数列为全0

    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;

        nums[a-1] += i; // 在起始位置加上当前操作的索引i
        if (b < n) {
            nums[b] -= i; // 在终止位置后一位减去当前操作的索引i
        }
    }

    // 根据数列的变化,计算最后的数列
    for (int i = 1; i < n; i++) {
        nums[i] += nums[i-1];
    }

    // 输出最后的数列
    for (int i = 0; i < n; i++) {
        cout << nums[i] << " ";
    }

    return 0;
}

时间复杂度:O(n + m),其中n为数列长度,m为操作的区间个数。 空间复杂度:O(n),用来存储数列的变化。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^