本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
AcWing:797. 差分 - AcWing题库
【题目描述】
输入一个长度为 n n n 的整数序列。
接下来输入 m m m 个操作,每个操作包含三个整数 l , r , c l,r,c l,r,c,表示将序列中 [ l , r ] [l,r] [l,r] 之间的每个数加上 c c c。
请你输出进行完所有操作后的序列。
【输入】
第一行包含两个整数 n n n 和 m m m。
第二行包含 n n n 个整数,表示整数序列。
接下来 m m m 行,每行包含三个整数 l , r , c l,r,c l,r,c,表示一个操作。
【输出】
共一行,包含 n n n 个整数,表示最终序列。
【输入样例】
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
【输出样例】
3 4 5 3 4 2
【解题思路】
【算法标签】
《AcWing 797 差分》 #差分#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100010; // 定义数组最大长度
int n, m; // n: 数组长度, m: 操作次数
int a[N]; // 原始数组
int b[N]; // 差分数组
/**
* 差分数组区间更新操作
* @param l 区间左端点
* @param r 区间右端点
* @param c 要增加的值
*/
void insert(int l, int r, int c)
{
b[l] += c; // 左端点加c
b[r + 1] -= c; // 右端点+1位置减c
}
int main()
{
// 输入数组长度和操作次数
scanf("%d%d", &n, &m);
// 输入原始数组
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
// 初始化差分数组(两种方式等价)
// 方式1: 直接计算差分 b[i] = a[i] - a[i-1]
// 方式2: 通过insert函数逐个元素插入
for (int i = 1; i <= n; i++)
{
insert(i, i, a[i]);
}
// 处理每个区间更新操作
while (m--)
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c); // 执行区间更新
}
// 计算前缀和,得到更新后的数组
for (int i = 1; i <= n; i++)
{
b[i] += b[i - 1];
}
// 输出最终数组
for (int i = 1; i <= n; i++)
{
printf("%d ", b[i]);
}
return 0;
}
【运行结果】
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
3 4 5 3 4 2