LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4
题目描述
给出一个长为 nn 的数列,以及 nn 个操作,操作涉及区间加法,区间求和。
输入格式
第一行输入一个数字 nn。
第二行输入 nn 个数字,第 ii 个数字为 a_iai,以空格隔开。
接下来输入 nn 行询问,每行输入四个数字 \mathrm{opt}opt、ll、rr、cc,以空格隔开。
若 \mathrm{opt} = 0opt=0,表示将位于 [l, r][l,r] 的之间的数字都加 cc。
若 \mathrm{opt} = 1opt=1,表示询问位于 [l, r][l,r] 的所有数字的和 \bmod (c+1)mod(c+1)。
输出格式
对于每次询问,输出一行一个数字表示答案。
样例
样例输入
4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
样例输出
1
4
数据范围与提示
对于 100\%100% 的数据,1 \leq n \leq 50000, -2^{31} \leq \mathrm{others}1≤n≤50000,−231≤others、\mathrm{ans} \leq 2^{31}-1ans≤231−1。
代码;
1 //#6280. 数列分块入门 4-区间加法,区间求和 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int maxn=5e4+10; 6 7 int n,m,pos[maxn]; 8 ll a[maxn],b[maxn],tag[maxn]; 9 10 void update(int l,int r,ll c) 11 { 12 for(int i=l;i<=min(pos[l]*m,r);i++){ 13 a[i]+=c; 14 b[pos[l]]+=c; 15 } 16 if(pos[l]!=pos[r]){ 17 for(int i=(pos[r]-1)*m+1;i<=r;i++){ 18 a[i]+=c; 19 b[pos[r]]+=c; 20 } 21 } 22 for(int i=pos[l]+1;i<pos[r];i++){ 23 tag[i]+=c; 24 } 25 } 26 27 ll query(int l,int r) 28 { 29 ll ans=0; 30 for(int i=l;i<=min(pos[l]*m,r);i++){ 31 ans+=a[i]+tag[pos[l]]; 32 } 33 if(pos[l]!=pos[r]){ 34 for(int i=(pos[r]-1)*m+1;i<=r;i++){ 35 ans+=a[i]+tag[pos[r]]; 36 } 37 } 38 for(int i=pos[l]+1;i<pos[r];i++){ 39 ans+=b[i]+tag[i]*m; 40 } 41 return ans; 42 } 43 44 int main() 45 { 46 scanf("%d",&n); 47 m=sqrt(n); 48 for(int i=1;i<=n;i++){ 49 scanf("%d",&a[i]); 50 b[i]=a[i]; 51 pos[i]=(i-1)/m+1; 52 } 53 for(int i=1;i<=m+1;i++){ 54 int cnt=0; 55 for(int j=(i-1)*m+1;j<=min(i*m,n);j++){ 56 cnt+=a[j]; 57 } 58 b[i]=cnt; 59 } 60 for(int i=1;i<=n;i++){ 61 int op,l,r; 62 ll c; 63 scanf("%d%d%d%lld",&op,&l,&r,&c); 64 if(op==0){ 65 update(l,r,c); 66 } 67 else{ 68 printf("%lld\n",query(l,r)%(c+1)); 69 } 70 } 71 } 72 73 74 /* 75 10 76 1 3 4 2 5 7 11 3 5 1 77 0 1 5 1 78 1 1 7 2 79 0 3 9 1 80 1 4 8 7 81 1 1 10 6 82 1 3 5 3 83 1 5 10 7 84 1 6 10 6 85 1 2 7 4 86 1 2 7 5 87 88 2 89 3 90 5 91 1 92 6 93 3 94 1 95 5 96 */
转载于:https://www.cnblogs.com/ZERO-/p/10525669.html
LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)相关推荐
- LibreOJ 6279 数列分块入门 3(分块+排序)
题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...
- P3373 【模板】线段树 2(区间乘法+区间加法+区间求和)
题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,pn,m,p,分别表示该数 ...
- 【分块入门】LOJ 数列分块入门 1 - 9 (学习更新……)
dl题解 _「分块」数列分块入门1 – 9 by hzwer LOJ #6277. 数列分块入门 1 题意:给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 时间限制:100ms 分块 ...
- 数列分块入门 (1 ~ 7)
分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n.对于区间加操作,我们可以 ...
- 「分块」数列分块入门1 – 9
ACM模板 放暑假了,回归!!! 自己不会写暴力,而且好久没写代码了,于是学学分块的优雅暴力~ 「分块入门-LibreOJ」 「分块」数列分块入门1 – 9 by hzwer 数列简单分块问题实际上有 ...
- 几个线段树板子(区间加/区间加与乘)
一直仰慕dl能够把线段树玩出花来,所以就想手写并整理一下几个常见的线段树板子(主要是结构化得好看一些) Part Ⅰ区间加法+区间求和 洛谷P3372 基础中的基础 //luogu P3372 199 ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给出一 ...
- LOJ 数列分块入门6
LOJ 数列分块入门6 题目: 题目 题解: 我都不懂这题为什么要用分块... ... 直接vector就好了... 但是如果有区间修改的话就不行了.所以这题是启示我们也可以动态分块.具体就是每次插入 ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
最新文章
- 王飞跃:平行汽车到平行驾驶,从“功能汽车”到“智能汽车”
- 008 centos7安装docker ce
- POJ 2195 【二分图最佳匹配】.cpp
- boost学习之BOOST_PP_REPEAT
- 为节省内存,动态添加view布局和控件
- scala实现数值类型加法
- 虚函数、C++类、结构体、父类与子类的继承性
- 使用SCM管理jenkinsfile
- sam格式的结构和意义_SAM文件是什么
- winsxs探索之组件的本质:文件与注册表
- Resional Rose使用说明
- 成语填空微信小程序,登录接口修复版
- raid卡缓存对硬盘性能_告诉你NAS究竟用不用RAID?万兆网络下NAS读取写入实测分...
- PDM转换成Word文档或者XML文档
- r语言C指数的置信区间,R语言入门:均值置信区间
- html页面漏斗图,漏斗图 | JShare
- Java开发全套学习!mysql配置文件my.ini找不到
- CNCC 2018 科技展盛况空前,近 100 家企业汇聚一堂
- Servlet3.0实现的简单mvc框架
- 简读《Head First设计模式》