水题 等差数列HDU 5400 Arithmetic Sequence

主要是要知道它对于等差数列的定义,单个数也可以作为等差数列且一定满足题意,另外就是要算清楚区间与区间的关系,考虑两大类情况,一种是d1区间和d2区间连在一起,另外一种情况就是其余情况。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define MAXN 100005
 5 long long num[MAXN];
 6 bool tag[MAXN];
 7 using namespace std;
 8 long long getNum(long long x){
 9     return (x)*(x+1)/2;
10 }
11 int main(){
12     long long n,d1,d2,i,j,k,left,right,l_sum,r_sum,sum;
13     bool isRL = false;
14     while(scanf("%lld%lld%lld",&n,&d1,&d2)!=EOF){
15         for(i = 0;i < n ;i++){
16             scanf("%lld",&num[i]);
17         }
18         for(i = 0;i < n-1 ; i++){
19             num[i] = num[i+1] - num[i];
20         }
21         memset(tag,false,sizeof(tag));
22         l_sum = 0;
23         r_sum = 0;
24         sum = 0;
25         for(i = 0;i < n-1 ; i++)//d1区间与d2区间连在一起
26         {
27             if(tag[i] == true)
28                 continue;
29             if(num[i]==d1 && num[i+1]==d2){
30                 tag[i] = true;
31                 tag[i+1] = true;
32                 l_sum = 1;
33                 r_sum = 1;
34                 for(j = i-1 ; j>=0 ; j--){
35                     if(num[j] == d1){
36                         l_sum ++;
37                         tag[j]= true;
38                     }
39                     else
40                         break;
41                 }
42                 for(j = i+2 ; j< n-1 ; j++){
43                     if(num[j] == d2){
44                         r_sum ++;
45                         tag[j]= true;
46                     }
47                     else
48                         break;
49                 }
50                 sum = sum + l_sum*r_sum +getNum(l_sum) + getNum(r_sum);
51             }
52         }
53         k =0 ;
54         for(i = 0;i < n-1;i++){//其余情况
55             if(tag[i]==true)
56                 continue;
57             if(num[i]==d1){
58                 k = 1;
59                 for(j = i+1 ; j<n-1;j++){
60                     if(num[j]==d1){
61                         k++;
62                         i = j;
63                         tag[j] = true;
64                     }
65                     else {
66                         i = j-1;
67                         break;
68                     }
69                 }
70                 sum = sum+getNum(k);
71             }
72             else if(num[i]==d2){
73                 k = 1;
74                 for(j = i+1 ; j<n-1;j++){
75                     if(num[j]==d2){
76                         k++;
77                         i = j;
78                         tag[j] = true;
79                     }
80                     else {
81                         i = j-1;
82                         break;
83                     }
84                 }
85                 sum = sum+getNum(k);
86             }
87             else
88             {
89                 continue;
90             }
91         }
92         sum+=n;
93         printf("%lld\n",sum);
94     }
95     return 0;
96 }

 

posted @ 2015-08-22 16:35  fancy_boy  阅读(185)  评论(0编辑  收藏  举报