[ABC369C] Count Arithmetic Subarrays

首先看了下题意 大致题意就是让你在长度为N的序列找出所有的等差数列。

-----------------------------------------------------------------------------------------我是分界线

我的思路了,就是先从2开始计算等差数列,从3开始判断,如果是等差数列的话就继续累加,如果不是判断它是否是第一个等差数列,是就直接ans+=cnt\ast(cnt+1)/2,如果不是就减1去除掉重复的部分。最后把未处理的部分加上去就行了。


 注意题目上给出的限制

  • 1≤ N ≤ 2× 105
  • 1≤ Ai ≤ 1091≤ Ai​ ≤ 109

 要开long long,否则会爆int。

#include
#define int long long
#define fast register int 

using namespace std;

const int N=2e5+100;

int a[N],n,m,b[N],cnt=2,ans=0,d=0,flag=1;
//cnt代表着现在等差数列包含的数的数量,ans代表最终答案,d就是等差数列的差,flag代表着是否是$A$序列是一个完整的等差数列

signed main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0); //不喜欢标准输入输出的人的专用
    
    cin>>n;
    
    if (n==1){
        cout<<1;
        return 0;
    }//n=1直接输出1
    
    for (fast i=1;i<=n;i++){
        cin>>a[i];
        if (i==2){
            cnt=2;
            qwq=a[i]-a[i-1];
            continue;
        }
        if (i>=3){
            if (a[i]-a[i-1]==d){//如果相等就继续累加
                cnt++;
                continue;//跳过下个步骤
            }
            else {
                if (flag==1){//如果是一串从a[1]开始就不减1
                    ans+=cnt*(cnt+1)/2;
                    flag++;//flag更改
                }
                else {//反之要去除掉重复的部分,就要减1
                    ans+=cnt*(cnt+1)/2-1;
                }
                cnt=2;//重新从a[i-1]开始一个新的等差数列
                d=a[i]-a[i-1];//更新q
                continue;
            }
        }
    }
   //将最后的数列也要算进去
    if (flag!=1){//如果不是一条从a[1]到a[n]的连续的等差数列就减1
        ans+=cnt*(cnt+1)/2-1;
    }
    
    else {//反之不减
        ans+=cnt*(cnt+1)/2;
    }
    
    cout<

你可能感兴趣的:(算法,c++)