#6280. 数列分块入门 4

内存限制:256 MiB时间限制:500 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: hzwer

提交提交记录统计测试数据讨论

题目描述

给出一个长为 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-分块(区间加法、区间求和)相关推荐

  1. LibreOJ 6279 数列分块入门 3(分块+排序)

    题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...

  2. P3373 【模板】线段树 2(区间乘法+区间加法+区间求和)

    题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,pn,m,p,分别表示该数 ...

  3. 【分块入门】LOJ 数列分块入门 1 - 9 (学习更新……)

    dl题解 _「分块」数列分块入门1 – 9 by hzwer LOJ #6277. 数列分块入门 1 题意:给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 时间限制:100ms 分块 ...

  4. 数列分块入门 (1 ~ 7)

    分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n​.对于区间加操作,我们可以 ...

  5. 「分块」数列分块入门1 – 9

    ACM模板 放暑假了,回归!!! 自己不会写暴力,而且好久没写代码了,于是学学分块的优雅暴力~ 「分块入门-LibreOJ」 「分块」数列分块入门1 – 9 by hzwer 数列简单分块问题实际上有 ...

  6. 几个线段树板子(区间加/区间加与乘)

    一直仰慕dl能够把线段树玩出花来,所以就想手写并整理一下几个常见的线段树板子(主要是结构化得好看一些) Part Ⅰ区间加法+区间求和 洛谷P3372 基础中的基础 //luogu P3372 199 ...

  7. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给出一 ...

  8. LOJ 数列分块入门6

    LOJ 数列分块入门6 题目: 题目 题解: 我都不懂这题为什么要用分块... ... 直接vector就好了... 但是如果有区间修改的话就不行了.所以这题是启示我们也可以动态分块.具体就是每次插入 ...

  9. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

最新文章

  1. 王飞跃:平行汽车到平行驾驶,从“功能汽车”到“智能汽车”
  2. 008 centos7安装docker ce
  3. POJ 2195 【二分图最佳匹配】.cpp
  4. boost学习之BOOST_PP_REPEAT
  5. 为节省内存,动态添加view布局和控件
  6. scala实现数值类型加法
  7. 虚函数、C++类、结构体、父类与子类的继承性
  8. 使用SCM管理jenkinsfile
  9. sam格式的结构和意义_SAM文件是什么
  10. winsxs探索之组件的本质:文件与注册表
  11. Resional Rose使用说明
  12. 成语填空微信小程序,登录接口修复版
  13. raid卡缓存对硬盘性能_告诉你NAS究竟用不用RAID?万兆网络下NAS读取写入实测分...
  14. PDM转换成Word文档或者XML文档
  15. r语言C指数的置信区间,R语言入门:均值置信区间
  16. html页面漏斗图,漏斗图 | JShare
  17. Java开发全套学习!mysql配置文件my.ini找不到
  18. CNCC 2018 科技展盛况空前,近 100 家企业汇聚一堂
  19. Servlet3.0实现的简单mvc框架
  20. 简读《Head First设计模式》

热门文章

  1. spring源码刨析总结
  2. 【算法】Kruskal算法(解决最小生成树问题) 含代码实现
  3. 每天一道LeetCode-----找到所有被某个字符包围的另一个字符
  4. 用golang完成tcp协议传输
  5. SqueezeNet网络模型详解
  6. MFC命令行及CCommandLineInfo类
  7. /MD, /MDD, /ML, /MT,/MTD(使用运行时库)
  8. 滑动窗口 - 替换后的最长重复字符
  9. oracle with check option 的作用
  10. 【题解】lugu P4095 Eden的新背包问题