【题目描述】

给出一个长为 n 的数列,以及 n 个操作,操作涉及区间乘法,区间加法,单点询问。

【输入格式】

第一行输入一个数字 n。

第二行输入 n 个数字,第 i 个数字为 ai,以空格隔开。

接下来输入 n 行询问,每行输入四个数字 opt、l、r、c,以空格隔开。

若 opt=0,表示将位于 [l,r] 的之间的数字都加 c。

若 opt=1,表示将位于 [l,r] 的之间的数字都乘 c。

若 opt=2,表示询问 ar 的值 mod 10007(l 和 c 忽略)。

【输出格式】

对于每次询问,输出一行一个数字表示答案。

【样例】

样例输入
7
1 2 2 3 9 3 2
0 1 3 1
2 1 3 1
1 1 4 4
0 1 7 2
1 2 6 4
1 1 6 5
2 2 6 4

样例输出
3
100

【数据范围与提示】

对于 100% 的数据,1<=n<=100000,-2^31<=other,ans<=2^31-1。

【源代码】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 10000+7;
const int N = 1000000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;int n;
int block,sum;//block为块的长度,sum为块的个数
int a[N];//存放数列元素
int pos[N];//pos记录第i个元素在第几个块中
int mulTag[N];//乘法标记
int addTag[N];//加法标记
void init(int n){block=sqrt(n);//块的长度sum=n/block;//块个数if(n%block)sum++;for(int i=1;i<=n;i++)//第i个元素在第几块中pos[i]=(i-1)/block+1;for(int i=1;i<=sum;i++)//乘法标记初始化为1mulTag[i]=1;
}
void reset(int x){//更新不完整块的值for(int i=(pos[x]-1)*block+1;i<=min(pos[x]*block,n);i++)//更新元素a[i]=(mulTag[pos[x]]*a[i]+addTag[pos[i]])%MOD;//更新标记mulTag[pos[x]]=1;addTag[pos[x]]=0;
}
void update(int L,int R,int x,int op){reset(L);//更新左端不完整块for(int i=L;i<=min(pos[L]*block,R);i++){//左边的边角料if(op==0)a[i]=(a[i]+x)%MOD;elsea[i]=(a[i]*x)%MOD;}if(pos[L]!=pos[R]){//存在右区间才遍历,防止重复计算reset(R);//更新右端不完整块for(int i=(pos[R]-1)*block+1;i<=R;i++){//右边的边角料if(op==0)a[i]=(a[i]+x)%MOD;elsea[i]=(a[i]*x)%MOD;}}for(int i=pos[L]+1;i<=pos[R]-1;i++){//中间的整块if(op==0)addTag[i]=(addTag[i]+x)%MOD;else{addTag[i]=(addTag[i]*x)%MOD;mulTag[i]=(mulTag[i]*x)%MOD;}}
}
int query(int x){return (a[x]*mulTag[pos[x]]+addTag[pos[x]])%MOD;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[i]%=MOD;}init(n);for(int i=1;i<=n;i++){int op;int left,right,x;scanf("%d",&op);scanf("%d%d%d",&left,&right,&x);if(op==0||op==1)//加或乘update(left,right,x,op);else if(op==2)printf("%d\n",query(right));}return 0;
}

数列分块入门 7(LibreOj-6283)相关推荐

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

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

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

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

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

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

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

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

  5. #6279. 数列分块入门 3(区间修改,查询权值前驱)

    #6279. 数列分块入门 3 这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍. #include ...

  6. LOJ 数列分块入门6

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

  7. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

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

  8. 数列分块入门(套题)(loj6277,loj6278,loj6279,loj6280,loj6281,loj6282,loj6283,loj6284,loj6285)

    前言 zjoi考差了,码一些分块题缓解一下心情 壹 数列分块入门 1[loj6277] 题目大意:区间加,单点查 直接分块,区间加时完全覆盖的块打tag,边界块暴力重构 块大小设为n\sqrt nn​ ...

  9. 「分块系列」数列分块入门3 解题报告

    数列分块入门3 题意概括 区间加法,区间求前驱. 写在前面 这题的方法与分块2方法极其类似,建议自行解决. 正题 和上一题类似,但是二分不是用来计数的,而是用来求小于c的最大值的.然后对于不完整快,将 ...

  10. #6277. 数列分块入门 1

    题目链接:https://loj.ac/problem/6277 学习博客:http://hzwer.com/8053.html #6277. 数列分块入门 1 内存限制:256 MiB时间限制:10 ...

最新文章

  1. AutoML取得最新进展 深兰科技助推复杂场景下智能化应用
  2. Vue中data和computed的区别
  3. 我理解的 iOS 与 Android 的区别
  4. FCKeditor使用详解
  5. uniGUI试用笔记(二)
  6. avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转
  7. 弹框插件self(动效兼容到IE9,功能兼容IE6)
  8. mysql学习day03——02
  9. 翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化
  10. valgrind- 内存泄漏-how to install and use
  11. qt传递数组给js(支持多组)
  12. linux文件管理器thunar,文件管理器:Nautilus,Thunar,PCManFM,Konqueror,Dolphin,Krusader
  13. U产品快报 | UK8S支持K8S 1.18版本、URTC新版Webdemo上线等重要更新
  14. android persistent属性研究
  15. Msc.Marc模拟平板圆孔处应力集中:二维轴对称线弹性分析
  16. shell编程快速入门(一)
  17. RGB颜色值与十六进制颜色码
  18. Springboot毕设项目计算机类专业工程认证资料管理系统+e65c9(java+VUE+Mybatis+Maven+Mysql)
  19. “风华绝代”的【手机展示架】买了就绝不后悔
  20. js刻度尺插件_js滑块刻度尺插件

热门文章

  1. gridview不换行,高亮显示
  2. TensorFlow是什么?怎么用?终于有人讲明白了
  3. 张泉灵:时代抛弃你时,连一声再见都不会说
  4. 当 Swagger 遇上 Torna,瞬间高大上了!
  5. 微软允许员工永久在家办公,远程办公时代真的要来临了吗?
  6. 我是怎样刚拿饿了么P7 offer,然后途虎一轮游的
  7. 网传梅姨照片竟然是电脑合成的!仅需 100 行代码,你也能做到!
  8. 夺命连环问:一个 TCP 连接可以发多少个 HTTP 请求?|文末送书
  9. [JEEWX问题修复] JeeWX开源版2.3几处代码修改。
  10. MethodInvokingJobDetailFactoryBean的并发问题