水题 等差数列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 }