https://loj.ac/problem/6280

区间修改,区间求和。

本来线段树的活。

  1. //Stay foolish,stay hungry,stay young,stay simple
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cctype>
  5. #include<cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int MAXN=500005;
  9. ll sum[MAXN],r[MAXN],l[MAXN],inc[MAXN];
  10. ll a[MAXN],bl[MAXN],block;
  11. ll n,m,num;
  12. inline ll read_d(){
  13. ll ret=0,f=1;char c;
  14. while(c=getchar(),!isdigit(c)) f=c=='-'?-1:1;
  15. while(isdigit(c)){
  16. ret*=10;ret+=c-'0';c=getchar();
  17. }
  18. return ret*f;
  19. }
  20. inline void write(ll x)
  21. {
  22. if(x<0) x=-x;
  23. if(x>9) write(x/10);
  24. putchar(x%10+'0');
  25. }
  26. inline void build(){
  27. block=sqrt(n);
  28. num=n/block;
  29. if(n%block) num++;
  30. for(int i=1;i<=num;i++){
  31. l[i]=(i-1)*block+1;
  32. r[i]=i*block;
  33. }
  34. for(int i=1;i<=n;i++)
  35. bl[i]=(i-1)/block+1;
  36. r[num]=n;
  37. for(int i=1;i<=num;i++)
  38. for(int j=l[i];j<=r[i];j++)
  39. sum[i]+=a[j];
  40. }
  41. inline void updata(ll x,ll y,ll w){
  42. if(bl[x]==bl[y]){
  43. for(int i=x;i<=y;i++) a[i]+=w;
  44. sum[bl[x]]+=w*(y-x+1);
  45. return ;
  46. }
  47. for(int i=x;i<=r[bl[x]];i++)
  48. a[i]+=w,sum[bl[i]]+=w;
  49. for(int i=bl[x]+1;i<=bl[y]-1;i++)
  50. inc[i]+=w;
  51. for(int i=l[bl[y]];i<=y;i++)
  52. a[i]+=w,sum[bl[i]]+=w;
  53. }
  54. inline ll query(int x,int y){
  55. ll ret=0;
  56. if(bl[x]==bl[y]){
  57. for(int i=x;i<=y;i++) ret+=a[i]+inc[bl[i]];
  58. return ret;
  59. }
  60. for(int i=x;i<=r[bl[x]];i++) ret+=a[i]+inc[bl[i]];
  61. for(int i=bl[x]+1;i<=bl[y]-1;i++)
  62. ret+=sum[i]+inc[i]*(r[i]-l[i]+1);
  63. for(int i=l[bl[y]];i<=y;i++) ret+=a[i]+inc[bl[i]];
  64. return ret;
  65. }
  66. int main(){
  67. n=read_d();
  68. m=n;
  69. for(int i=1;i<=n;i++)
  70. a[i]=read_d();
  71. build();
  72. for(int i=1;i<=m;i++){
  73. ll q,x,y,z;
  74. q=read_d();
  75. x=read_d();
  76. y=read_d();
  77. z=read_d();
  78. if(q==0) updata(x,y,z);
  79. else write(query(x,y)%(z+1)),putchar('\n');//讲道理是得query里每步模的
  80. }
  81. return 0;
  82. }

[LOJ] 分块九题 4的更多相关文章

  1. [LOJ] 分块九题 6

    单点插入,单点查询. 优化了的链表. 链表老写错,干脆用vector,也不算慢. 注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置 ...

  2. [LOJ] 分块九题 3

    https://loj.ac/problem/6279 区间修改,区间查询前驱. TLE无数,我觉得这代码最精髓的就是block=1000. 谜一样的1000. 两个启示: 块内可以维护数据结构,比如 ...

  3. [LOJ] 分块九题 2

    https://loj.ac/problem/6278 区间修改,查询区间第k大. 块内有序(另存),块内二分. 还是用vector吧,数组拷贝排序,下标搞不来.. //Stay foolish,st ...

  4. [LOJ] 分块九题 1

    https://loj.ac/problem/6277 区间修改,单点查询. //Stay foolish,stay hungry,stay young,stay simple #include< ...

  5. [LOJ] 分块九题 8

    区间查询数值+整体赋值 维护tag代表整个区间被赋成了tag[i] 用pushdown操作,而不是修改了再check. 不压缩代码了,调起来心累,长点有啥不好. //Stay foolish,stay ...

  6. [LOJ] 分块九题 7

    区间加法,区间乘法,单点查询. 洛谷线段树2 屡清加法乘法的关系,定义答案为 a*mut+add 对于整块: 新的乘w,mut和add都要乘w 新的加w,add加w //Stay foolish,st ...

  7. [LOJ] 分块九题 5

    区间开平方,区间查询. lazy标记改为区间是否全是1或者0,这样的区间是没有更新价值的. //Stay foolish,stay hungry,stay young,stay simple #inc ...

  8. 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)

    闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...

  9. hzwer分块九题(暂时持续更新)

    hzwer分块9题 分块1:区间加法,单点查询 Code #include<bits/stdc++.h> #define in(i) (i=read()) using namespace ...

随机推荐

  1. bzoj 1814: Ural 1519 Formula 1【插头dp】

    设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把 ...

  2. bzoj 3594: [Scoi2014]方伯伯的玉米田【二维树状数组+dp】

    设f[i][j]为前i棵玉米被拔高了j(因为是单调不降所以前面越高越好,所以每次拔一个前缀),转移是f[i][j]=f[k][l]+1,l<=j,a[k]+l<=a[i]+j,然后用二维树 ...

  3. dd 使用记录

    使用dd的工具 1)测试写速度 2)测试读速度 3)测试读写速度 dd说明: if是输入文本,of是输出文本,bs是块大小,count是你指定读写块的数量 /dev/zero是从内存里面读取,不会产生 ...

  4. apcloud混合式开发app学习笔记

    修改图标新建项目检出到本地--------------------------1.api.ajax var loginName = $api.val($api.byId('uname')); var ...

  5. C/C++程序计时函数gettimeofday的使用

    linux 环境下 用 clock_t发现不准. 换用 //头文件 #include <sys/time.h> //使用timeval start, end;   gettimeofday ...

  6. 486 Predict the Winner 预测赢家

    给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,…….每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到没有剩余分数 ...

  7. MySQL系列:utf8_bin和utf8_general_ci编码的区别

    MySQL中存在多种格式的utf8编码,其中最常见的两种为: utf8_bin utf8_general_ci utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写;utf8_gener ...

  8. 阻止JEB 1.5频繁弹窗的办法

    偶尔才用一次的JEB, 出现 “Controller没有响应或者无法访问, JEB即将终止.” 也懒得去逆了.直接用ProcessHacker找到对应的线程挂起即可.当然这只是临时的办法..我也只是临 ...

  9. Android单独继承View类来实现自定义控件

    一个单独继承view类来实现自定义控件,在该方法中,需要重写ondraw方法来绘制自己所需要的控件,下面也以一个简单的例子来说明如何实现自定义控件.该方法可以实现所需要的所有的自定义控件. 属性文件中 ...

  10. 如何使用xftp工具在Windows与Linux之间传输文件

    如何使用xftp工具在Windows与Linux之间传输文件 整理者:vashon 声明:感谢开源社区 xftp工具是一款SFTP,FTP文件传输软件,可在Windows pc与Unix/Linux之 ...