博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解——loj6280 数列分块入门4 (分块)
阅读量:6092 次
发布时间:2019-06-20

本文共 1655 字,大约阅读时间需要 5 分钟。

分块维护一个区间和

然后记得更新的时候左边角块的tag不要打错到右边角块

#include 
#include
#include
#include
using namespace std;long long sz,num,n,belong[50100],a[50100],sum[50100],tag[50100];void calbe(int n){ for(int i=1;i<=n;i++) belong[i]=(i-1)/sz+1;}void reset(int x){ sum[x]=0; for(int i=(x-1)*sz+1;i<=min(x*sz,n);i++) sum[x]+=a[i];}void update(int l,int r,int w){ int xl=belong[l]; int xr=belong[r]; for(int i=l;i<=min(xl*sz,(long long)r);i++){ a[i]+=w; sum[xl]+=w; } if(xl!=xr){ for(int i=(xr-1)*sz+1;i<=r;i++){ a[i]+=w; sum[xr]+=w; } } for(int i=xl+1;i<=xr-1;i++){ tag[i]+=w; }}long long query(int l,int r,int w){ int xl=belong[l]; int xr=belong[r]; long long ans=0; for(int i=l;i<=min(xl*sz,(long long)r);i++) ans=(ans%w+(a[i]+tag[xl])%w)%w; if(xl!=xr){ for(int i=(xr-1)*sz+1;i<=r;i++) ans=(ans%w+(a[i]+tag[xr])%w)%w; } for(int i=xl+1;i<=xr-1;i++) ans=(ans%w+(sum[i]+(tag[i]*sz))%w)%w; return ans;}int main(){ scanf("%lld",&n); sz=sqrt(n); num=n/sz; calbe(n); if(n%sz) num++; for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=num;i++) reset(i);// for(int i=1;i<=num;i++)// printf("%d\n",sum[i]); for(int i=1;i<=n;i++){ int opt,l,r,c; scanf("%d %d %d %d",&opt,&l,&r,&c); if(opt==0) update(l,r,c); else printf("%lld\n",query(l,r,c+1)); } return 0;}

 

转载于:https://www.cnblogs.com/dreagonm/p/9507674.html

你可能感兴趣的文章
Centos 6.x 升级openssh版本
查看>>
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
mysql练习题40道
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
abb画学号
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>