1. 程式人生 > >F : yeleng與新型電瓶車

F : yeleng與新型電瓶車

include lse pair map i++ AS turn namespace col

題目鏈接:http://acm.xidian.edu.cn/problem.php?id=1315

  前綴和 + 枚舉 + map維護,map中key只有一個,不可重復,value可以重復;

區間和為sum[i] - sum[j],題目條件是 sum[i] - sum[j] = k,即查找是否存在sum[j] = sum[i] - k,在value中存放sum[i]之前的sum[j]有多少個,若find != end(),則做sum[j]++,否則將新的<sum[i],1>壓map;

***註意數字範圍

***1、-1、0要特殊處理

 1 #include<stdio.h>
 2
#include<math.h> 3 #include<map> 4 5 using namespace std; 6 7 map<long long,int> S; 8 int main() 9 { 10 int n; 11 int m; 12 int A[100005]; 13 long long sum[100005]; 14 while(scanf("%d %d",&n,&m) != EOF) 15 { 16 S.clear(); 17 int ans = 0
; 18 sum[0] = 0; 19 S.insert(pair<long long,int> (0,1)); 20 for(int i = 1;i <= n;i++) 21 { 22 scanf("%d",&A[i]); 23 sum[i] = sum[i - 1] + A[i]; 24 if(m == 1) 25 { 26 if(S.find(sum[i] - 1) != S.end())
27 ans += S[sum[i] - 1]; 28 } 29 else if(m == 0) 30 { 31 if(S.find(sum[i]) != S.end()) 32 ans += S[sum[i]]; 33 } 34 else if(m == -1) 35 { 36 if(S.find(sum[i] - 1) != S.end() ) 37 ans += S[sum[i] - 1]; 38 if(S.find(sum[i] + 1) != S.end() ) 39 ans += S[sum[i] + 1]; 40 } 41 else{ 42 long long temp = 0; 43 for(int k = 0;temp < 1e14 && temp > -1e14;k++) 44 { 45 temp = pow(m,k); 46 if(S.find(sum[i] - temp ) != S.end()) 47 ans += S[sum[i] - temp]; 48 } 49 } 50 if(S.find(sum[i]) != S.end()) 51 S[sum[i]]++; 52 else 53 S.insert(pair<long long,int> (sum[i],1)); 54 } 55 printf("%d\n",ans); 56 } 57 return 0; 58 }

F : yeleng與新型電瓶車