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
2015 Multi-University Training Contest 9


此题有个脑洞,长度可以为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;
}


你可能感兴趣的:(枚举,sequence,HDU,arithmetic,5400)