当前位置:   article > 正文

Codeforce Round #400 C 签到题_codeforces签到题

codeforces签到题

题目链接:点击打开链接


题目大意:

一个区间的价值【L,R】表示区间内所有元素的价值和。

问你一共有多少个区间的价值,是K的非负整数次幂(0,1,2,3,4,5............)。


题解:计算前缀和,并将已计算的前缀和放入map中储存,对于每个新的前缀和,只需去map中查找是否有满足条件的前缀和即可。


Code:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <map>
  6. #define ll long long
  7. using namespace std;
  8. const int maxn = 1e5 + 10;
  9. const ll INF = 1e14 + 20;
  10. int n,k;
  11. ll a[maxn],ans = 0;
  12. ll nums[51],ncnt;
  13. map<ll,int> map1;
  14. int main()
  15. {
  16. scanf("%d%d",&n,&k);
  17. for(int i = 1;i <= n;i++) scanf("%I64d",&a[i]);
  18. if(k == 1) {ncnt = 1;nums[1] = 1;}
  19. else if(k == -1) {ncnt = 2;nums[1] = -1;nums[2] = 1;}
  20. else {
  21. ll temp = 1;
  22. for(ncnt = 1;temp <= INF;ncnt++){
  23. nums[ncnt] = temp;
  24. temp *= k;
  25. }ncnt--;
  26. }
  27. ll sum = 0;ans = 0;
  28. map1[0] = 1;
  29. for(int i = 1;i <= n;i++){
  30. sum += a[i];
  31. for(int j = 1;j <= ncnt;j++){
  32. if(map1.count(sum - nums[j])) ans += map1[sum - nums[j]];
  33. }
  34. map1[sum]++;
  35. }
  36. printf("%I64d\n",ans);
  37. return 0;
  38. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/1003977
推荐阅读
相关标签
  

闽ICP备14008679号