hdu 5400 Arithmetic Sequence 2015多校联合训练赛#9 枚举

Arithmetic Sequence

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 624    Accepted Submission(s): 280


Problem Description
A sequence  b1,b2,,bn  are called  (d1,d2) -arithmetic sequence if and only if there exist  i(1in)  such that for every  j(1j<i),bj+1=bj+d1 and for every  j(ij<n),bj+1=bj+d2 .

Teacher Mai has a sequence  a1,a2,,an . He wants to know how many intervals  [l,r](1lrn)  there are that  al,al+1,,ar  are  (d1,d2) -arithmetic sequence.
 

Input
There are multiple test cases.

For each test case, the first line contains three numbers  n,d1,d2(1n105,|d1|,|d2|1000) , the next line contains  n  integers  a1,a2,,an(|ai|109) .
 

Output
For each test case, print the answer.
 

Sample Input
  
  
5 2 -2 0 2 0 -2 0 5 2 3 2 3 3 3 3
 

Sample Output
  
  
12 5
 

Author
xudyh
 

Source


此题有个脑洞,长度可以为0,不一定必须存在j。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define maxn 100007
int num[maxn];
int lef[maxn];
int rig[maxn];

int main(){
    //freopen("in.txt","r",stdin);
   //freopen("outx.txt","w",stdout);
    int n,d1,d2;
    while(scanf("%d%d%d",&n,&d1,&d2)!=EOF){
        for(int i = 1;i <= n; i++)
            scanf("%d",&num[i]);
        memset(lef,0,sizeof(lef));
        memset(rig,0,sizeof(rig));
        for(int i = 2;i <= n; i++)
            if(num[i] - num[i-1] == d1)
                lef[i] = lef[i-1]+1;
        for(int i = n-1; i>=1; i--)
            if(num[i+1]-num[i] == d2)
                rig[i] = rig[i+1]+1;
        ll ans  = 0 ;
        if(d1 == d2){
            for(int i = 1;i <= n; i++)
                ans += lef[i]+1;
        }
        else {
            for(int i = 1;i <= n; i++)
                ans += 1ll*(lef[i]+1)*(rig[i]+1);
        }
        cout<<ans<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GDRetop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值