当前位置:   article > 正文

BZOJ4627 [BeiJing2016]回转寿司_nor前缀

nor前缀

求前缀和,相当于对于每个i求1<=j<i,L<=s[i]-s[j]<=R的个数然后加起来,用权值线段树搞就好了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<iomanip>
  8. #include<ctime>
  9. #include<vector>
  10. #include<stack>
  11. #include<set>
  12. #include<bitset>
  13. #include<map>
  14. #include<queue>
  15. using namespace std;
  16. #define MAXN 100010
  17. #define MAXM 8000010
  18. #define MOD 1000000007
  19. #define INF 10000000000ll
  20. #define eps 1e-8
  21. #define ll long long
  22. int n,L,R;
  23. int siz[MAXM],son[MAXM][2];
  24. int tot;
  25. int rt;
  26. void change(int &x,ll y,ll z,ll p){
  27. if(!x){
  28. x=++tot;
  29. }
  30. siz[x]++;
  31. if(y==z){
  32. return ;
  33. }
  34. ll mid=y+z>>1;
  35. if(p<=mid){
  36. change(son[x][0],y,mid,p);
  37. }else if(p>mid){
  38. change(son[x][1],mid+1,z,p);
  39. }
  40. }
  41. int ask(int x,ll y,ll z,ll l,ll r){
  42. if(!x){
  43. return 0;
  44. }
  45. if(y==l&&z==r){
  46. return siz[x];
  47. }
  48. ll mid=y+z>>1;
  49. if(r<=mid){
  50. return ask(son[x][0],y,mid,l,r);
  51. }else if(l>mid){
  52. return ask(son[x][1],mid+1,z,l,r);
  53. }else{
  54. return ask(son[x][0],y,mid,l,mid)+ask(son[x][1],mid+1,z,mid+1,r);
  55. }
  56. }
  57. ll ans;
  58. int main(){
  59. int i,x;
  60. ll s=0;
  61. scanf("%d%d%d",&n,&L,&R);
  62. for(i=1;i<=n;i++){
  63. scanf("%d",&x);
  64. change(rt,-INF,INF,s);
  65. s+=x;
  66. ans+=ask(rt,-INF,INF,max(-INF,s-R),min(INF,s-L));
  67. }
  68. printf("%lld\n",ans);
  69. return 0;
  70. }
  71. /*
  72. */


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

闽ICP备14008679号