本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
洛谷:AT_abc369_c [ABC369C] Count Arithmetic Subarrays - 洛谷
【题目描述】
You are given a sequence of
N
N
N positive integers
A
=
(
A
1
,
A
2
,
…
,
A
N
)
A=(A_1,A_2,…,A_N)
A=(A1,A2,…,AN).
给定一个包含
N
N
N 个正整数的序列
A
=
(
A
1
,
A
2
,
…
,
A
N
)
A=(A_1,A_2,…,A_N)
A=(A1,A2,…,AN)。
Find the number of pairs of integers
(
l
,
r
)
(l,r)
(l,r) satisfying
1
≤
l
≤
r
≤
N
1≤l≤r≤N
1≤l≤r≤N such that the subsequence
(
A
l
,
A
l
+
1
,
…
,
A
r
)
(A_l,A_{l+1},…,A_r)
(Al,Al+1,…,Ar) forms an arithmetic progression.
求满足
1
≤
l
≤
r
≤
N
1≤l≤r≤N
1≤l≤r≤N 且子序列
(
A
l
,
A
l
+
1
,
…
,
A
r
)
(A_l,A_{l+1},…,A_r)
(Al,Al+1,…,Ar) 构成等差数列的整数对
(
l
,
r
)
(l,r)
(l,r) 的数量。
A sequence
(
x
1
,
x
2
,
…
,
x
∣
x
∣
)
(x_1,x_2,…,x_{|x|})
(x1,x2,…,x∣x∣) is an arithmetic progression if and only if there exists a dd such that
x
i
+
1
−
x
i
=
d
(
1
≤
i
<
∣
x
∣
)
x_{i+1}−x_i=d (1≤i<|x|)
xi+1−xi=d(1≤i<∣x∣). In particular, a sequence of length
1
1
1 is always an arithmetic progression.
当且仅当存在公差
d
d
d 使得
x
i
+
1
−
x
i
=
d
(
1
≤
i
<
∣
x
∣
)
x_{i+1}−x_i=d (1≤i<|x|)
xi+1−xi=d(1≤i<∣x∣) 时,序列
(
x
1
,
x
2
,
…
,
x
∣
x
∣
)
(x_1,x_2,…,x_{|x|})
(x1,x2,…,x∣x∣) 构成等差数列,特别地,长度为
1
1
1 的序列恒为等差数列。
【输入】
The input is given from Standard Input in the following format:
N
A_1 A_2 ... A_N
【输出】
Print the answer.
【输入样例】
4
3 6 9 3
【输出样例】
8
【算法标签】
《洛谷 AT_abc369_c Count Arithmetic Subarrays》 #数学# #递推#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long // 定义int为long long类型
const int N = 200005; // 定义数组最大长度
int n; // 数组元素个数
int a[N]; // 存储输入数组
int ans; // 存储最终结果
int dp[N]; // 动态规划数组,记录以i结尾的等差数列长度
signed main() // 使用signed代替int,因为定义了#define int long long
{
// 输入数组元素个数
cin >> n;
// 输入数组元素
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
// 初始化结果为n(每个元素单独构成一个子数组)
ans = n;
// 初始化dp数组,每个元素至少可以单独构成一个长度为1的子数组
for (int i = 1; i <= n; i++)
{
dp[i] = 1;
}
// 动态规划处理
for (int i = 2; i <= n; i++)
{
// 检查是否形成等差数列
if (i >= 3 && a[i] - a[i - 1] == a[i - 1] - a[i - 2])
{
// 如果形成等差数列,则长度加1
dp[i] = dp[i - 1] + 1;
}
else
{
// 否则重置为2(当前元素和前一个元素)
dp[i] = 2;
}
// 累加结果(减去1是因为dp[i]包含自身)
ans += dp[i] - 1;
}
// 输出最终结果
cout << ans << endl;
return 0;
}
【运行结果】
4
3 6 9 3
8