算法竞赛备考冲刺必刷题(C++) | 洛谷 AT_abc369_c Count Arithmetic Subarrays

本文分享的必刷题目是从蓝桥云课洛谷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 1lrN 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 1lrN 且子序列 ( 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,,xx) 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+1xi=d(1i<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+1xi=d(1i<x) 时,序列 ( x 1 , x 2 , … , x ∣ x ∣ ) (x_1,x_2,…,x_{|x|}) (x1,x2,,xx) 构成等差数列,特别地,长度为 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值