题目链接

  1. /*
  2. 如果用线段树,每个节点要再开k的空间,显然不行。但是分块可以(虽然空间依旧爆炸)
  3. 分块。用bloans[i][j]表示 第i块 模k为j 的有多少个
  4. 对于不是整块的,查询时应判断 A[i]+tag[belong[i]] ==k || ==0
  5. 对于整块,维护两个tag,一个是整块的加标记,另一个是整块的mod数标记tag2,初始时tag2为0
  6. 当整块+v时,tag2 -=v。因为查询的应是 模k=0 的数的个数,整块+v后,这块要查的就是 模k=k-v ((k-v+v)%k=0)的个数
  7. 这样就很巧妙地将整块加变成了改询问
  8. */
  9. #include<cmath>
  10. #include<cstdio>
  11. #include<cctype>
  12. #include<algorithm>
  13. using namespace std;
  14. const int N=2e5+5,MAXSZ=460;
  15. int n,m,k,size,A[N],belong[N],bloans[MAXSZ][N],tag[MAXSZ],tag2[MAXSZ];
  16. inline int read()
  17. {
  18. int now=0,f=1;register char c=getchar();
  19. for(;!isdigit(c);c=getchar())
  20. if(c=='-') f=-1;
  21. for(;isdigit(c);now=now*10+c-'0',c=getchar());
  22. return now*f;
  23. }
  24. void Update(int p,int v)
  25. {
  26. --bloans[belong[p]][A[p]];
  27. A[p]+=v;
  28. if(A[p]>=k) A[p]-=k;
  29. ++bloans[belong[p]][A[p]];
  30. }
  31. void Add(int l,int r,int v)
  32. {
  33. int t=min(r,belong[l]*size);
  34. for(int i=l; i<=t; ++i)
  35. Update(i,v);
  36. if(belong[l]!=belong[r])
  37. for(int i=(belong[r]-1)*size+1; i<=r; ++i)
  38. Update(i,v);
  39. for(int i=belong[l]+1; i<belong[r]; ++i)
  40. {
  41. tag[i]+=v, tag2[i]-=v;
  42. if(tag[i]>=k) tag[i]-=k;
  43. if(tag2[i]<0) tag2[i]+=k;
  44. }
  45. }
  46. int Query(int l,int r)
  47. {
  48. int res=0, t=min(r,belong[l]*size);
  49. for(int i=l; i<=t; ++i)
  50. if(A[i]+tag[belong[l]]==k || !(A[i]+tag[belong[l]]))
  51. ++res;
  52. if(belong[l]!=belong[r])
  53. for(int i=(belong[r]-1)*size+1; i<=r; ++i)
  54. if(A[i]+tag[belong[r]]==k || !(A[i]+tag[belong[r]]))//beblong[l] belong[r]别写反了
  55. ++res;
  56. for(int i=belong[l]+1; i<belong[r]; ++i)
  57. res+=bloans[i][tag2[i]];
  58. return res;
  59. }
  60. int main()
  61. {
  62. n=read(),m=read(),k=read();size=sqrt(n);
  63. for(int i=1;i<=n;++i)
  64. {
  65. A[i]=read()%k, belong[i]=(i-1)/size+1;
  66. if(A[i]<0) A[i]+=k;
  67. ++bloans[belong[i]][A[i]];
  68. }
  69. char opt[9];int l,r,v;
  70. while(m--)
  71. {
  72. scanf("%s",opt);l=read(),r=read();
  73. if(opt[0]=='a')
  74. v=read(), Add(l,r,(v%k+k)%k);
  75. else
  76. printf("%d\n",Query(l,r));
  77. }
  78. return 0;
  79. }

CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)的更多相关文章

  1. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  2. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  3. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  4. codevs 1080 线段树练习 CDQ分治

    codevs 1080 线段树练习 http://codevs.cn/problem/1080/  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 一行N个 ...

  5. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)

    线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...

  7. codevs5037 线段树练习4加强版(暴力分块)

    求大爷教线段树怎么写啊QAQ 只会写分块...一开始脑抽写成了O(NKlogN)还被CZL大爷嘲讽了一发T T f[i][j]表示在第i块中,模k为j的数有几个,然后每次修改的时候只需要打个标记,查询 ...

  8. codevs 1082 线段树练习 3 --分块练习

    时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[ ...

  9. Codevs 4927 线段树练习5(分块)

    4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的 ...

随机推荐

  1. 20165314 学习基础和C语言基础调查

    技能学习心得 你有什么技能比大多人(超过90%以上)更好?针对这个技能的获取你有什么成功的经验?与老师博客中的学习经验有什么共通之处? 从小我的父母就逼着我学习很多技能,比如钢琴,围棋,书法等,不过很 ...

  2. 使用springboot actuator监控应用

    微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题? ...

  3. EF Fluent API

    EntityTypeConfiguration 它可以为一个实体类,配置一个模型. Entity Framework 6 一次加载许多个 Fluent API 映射 如果对于许多实体有大量映射,则 O ...

  4. 免费API接口

    网址:https://code.juhe.cn/ http://apistore.baidu.com/ http://blog.csdn.net/cc20032706/article/details/ ...

  5. [转] 跨域资源共享 CORS 详解

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  6. ArcGIS 卷帘效果

    一直没注意ArcGIS自带了卷帘功能,使用方法:调出Effects工具条,里面就有卷帘工具. AE开发参考: http://bbs.esrichina-bj.cn/esri/viewthread.ph ...

  7. ssh连接时提示THE AUTHENTICITY OF HOST XX CAN’T BE ESTABLISHED

    ssh链接云主机: ssh root@123.59.xx.xx 报错:THE AUTHENTICITY OF HOST XX CAN’T BE ESTABLISHED 解决办法: ssh -o Str ...

  8. 今天开始学习php,粘一些重点放这以便查看记忆。

    1.PHP的变量用$定义. PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中. index 保存变量的名称.这个数组可以在函数内部访问,也可以直接用来更新全局变量. 2. ...

  9. orleans exception序列化

    options.FallbackSerializationProvider = typeof(ILBasedSerializer).GetTypeInfo();

  10. kmp基础 ekmp

    +]; int lenp,lens; +];//可以是char 也可以是string +]; void getnext() { nex[]=-; ,j=; ) { ||p[j]==p[k]) nex[ ...