【问题描述】 输入一个长度为n的整数序列。 接下来输入m个操作,每个操作包含三个整数l,r,c,表示将序列中[l,r]之间的每个数加上c。 请你输出进行完所有操作后的序列。 【输入格式】 第一行包含两个整数n和m。 第二行包含n个整数,表示整数序列。 接下来m行,每行包含三个整数l,r,c表示一个操作。 【输出格式】 共一行,包含n个整数,表示最终序列。 【数据范围】 1≤n,m≤100000, 1≤l≤r≤n,使用C++语言
时间: 2024-03-17 18:41:54 浏览: 92
C++代码:(与Python的算法思路相同)
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
int a[N], d[N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
// 构造差分数组
for (int i = 1; i <= n; i ++ ) d[i] = a[i] - a[i - 1];
while (m -- )
{
int l, r, c;
cin >> l >> r >> c;
d[l] += c;
d[r + 1] -= c;
}
// 求前缀和
for (int i = 2; i <= n; i ++ ) d[i] += d[i - 1];
// 输出结果
for (int i = 1; i <= n; i ++ ) cout << d[i] << ' ';
cout << endl;
return 0;
}
```
相关问题
【问题描述】 输入一个长度为n的整数序列。 接下来输入m个操作,每个操作包含三个整数l,r,c,表示将序列中[l,r]之间的每个数加上c。 请你输出进行完所有操作后的序列。 【输入格式】 第一行包含两个整数n和m。 第二行包含n个整数,表示整数序列。 接下来m行,每行包含三个整数l,r,c表示一个操作。 【输出格式】 共一行,包含n个整数,表示最终序列。 【数据范围】 1≤n,m≤100000, 1≤l≤r≤n,
【样例输入】
5 3
1 2 3 4 5
1 3 2
3 5 -1
2 4 1
【样例输出】
3 4 5 6 5
【算法思路】
题目要求对序列进行多次修改,可以使用差分的思想,即将每次修改的区间[l,r]的左端点l加上c,右端点r+1加上-c。最后再对整个序列求前缀和,即可得到修改后的序列。
【Python代码】
```python
n, m = map(int, input().split())
a = list(map(int, input().split()))
# 差分数组
d = [0] * (n + 1)
for i in range(1, n + 1):
d[i] = a[i - 1] - a[i - 2]
# 执行m次操作
for i in range(m):
l, r, c = map(int, input().split())
d[l] += c
if r < n:
d[r + 1] -= c
# 求前缀和
for i in range(2, n + 1):
d[i] += d[i - 1]
# 输出结果
for i in range(1, n + 1):
print(d[i], end=' ')
```
运用C++写一个代码:输入一个长度为n的整数序列,接下来输入m个操作,每个操作包含三个整数l,r,c表示将序列中[[l,r][l,r]]之间的每个数加上c。请你输出进行完所有操作后的序列
在C++中,你可以使用数组和循环结构来实现这个功能。首先,我们需要创建一个动态大小的数组来存储输入的序列,然后处理每一个操作并更新数组。以下是一个简单的示例代码:
```cpp
#include <iostream>
#include <vector>
// 函数用于处理操作
void applyOperations(int* arr, int n, std::vector<std::tuple<int, int, int>>& operations) {
for (const auto& op : operations) {
int l = std::get<0>(op);
int r = std::get<1>(op);
int c = std::get<2>(op);
// 确保索引在范围内
if (l >= 0 && l <= n - 1 && r >= 0 && r <= n - 1) {
for (int i = l; i <= r; ++i) {
arr[i] += c;
}
}
}
}
int main() {
int n;
std::cout << "请输入序列的长度: ";
std::cin >> n;
// 创建动态数组
std::vector<int> arr(n);
std::cout << "请输入序列元素: ";
for (int i = 0; i < n; ++i) {
std::cin >> arr[i];
}
int m;
std::cout << "请输入操作的数量: ";
std::cin >> m;
std::vector<std::tuple<int, int, int>> operations(m);
std::cout << "请输入每个操作(l, r, c): ";
for (size_t i = 0; i < m; ++i) {
std::cin >> std::get<0>(operations[i]) >> std::get<1>(operations[i]) >> std::get<2>(operations[i]);
}
applyOperations(arr.data(), n, operations);
std::cout << "操作后序列: ";
for (const auto& num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
```
在这个程序中,用户会依次输入序列的长度、每个元素、操作的数量以及每个操作的具体细节。`applyOperations`函数负责根据提供的操作对序列进行更新。
阅读全文