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),用来存储数列的变化。
【相关推荐】