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

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

题目描述

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

输入格式

第一行输入一个数字 nnn。

第二行输入 nnn 个数字,第 i 个数字为 aia_ia​i​​,以空格隔开。

接下来输入 nnn 行询问,每行输入四个数字 opt\mathrm{opt}opt、lll、rrr、ccc,以空格隔开。

若 opt=0\mathrm{opt} = 0opt=0,表示将位于 [l,r][l, r][l,r] 的之间的数字都加 ccc。

若 opt=1\mathrm{opt} = 1opt=1,表示将位于 [l,r][l, r][l,r] 的之间的数字都乘 ccc。

若 opt=2\mathrm{opt} = 2opt=2,表示询问 ara_ra​r​​ 的值 mod 10007mod \ 10007mod 10007(lll 和 ccc 忽略)。

输出格式

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

样例

样例输入

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% 100\%100% 的数据,1≤n≤100000,−231≤others 1 \leq n \leq 100000, -2^{31} \leq \mathrm{others}1≤n≤100000,−2​31​​≤others、ans≤231−1 \mathrm{ans} \leq 2^{31}-1ans≤2​31​​−1。

显示分类标签

对于两种标记,分别进行维护。

按照运算规律(这个可以自己推式子),我们先考虑乘法,再考虑加法

对于加的操作,相当于直接对于每个块的加法标记加

对于乘的操作,我们需要对乘法标记和加法标记都乘上对应的值

零散块不好记录,直接暴力修改

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=1e5+10,mod=10007;
inline char nc()
{static char buf[MAXN],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin)),p1==p2?EOF:*p1++;
}
inline int read()
{char c=nc();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}return x*f;
}
int a[MAXN],belong[MAXN],L[MAXN],R[MAXN],block,N;
int mul[MAXN],add[MAXN];
void reset(int x)
{for(int i=L[x*block];i<=min(N,R[x*block]);i++)a[i]=(a[i]*mul[x]+add[x])%mod;mul[x]=1;add[x]=0;
}
void Add(int l,int r,int val)
{reset(belong[l]);for(int i=l;i<=min(r,R[l]);i++) a[i]+=val,a[i]%=mod;if(belong[l]!=belong[r]){reset(belong[r]);for(int i=L[r];i<=r;i++)a[i]+=val,a[i]%=mod;}for(int i=belong[l]+1;i<=belong[r]-1;i++)add[i]+=val,add[i]%=mod;
}
void Mul(int l,int r,int val)
{reset(belong[l]);for(int i=l;i<=min(r,R[l]);i++) a[i]*=val,a[i]%=mod;if(belong[l]!=belong[r]){reset(belong[r]);for(int i=L[r];i<=r;i++)a[i]*=val,a[i]%=mod;}for(int i=belong[l]+1;i<=belong[r]-1;i++)mul[i]*=val,add[i]*=val,mul[i]%=mod,add[i]%=mod;
}
int main()
{#ifdef WIN32freopen("a.in","r",stdin);#else#endifN=read();block=sqrt(N);fill(mul,mul+N+1,1);for(int i=1;i<=N;i++) a[i]=read()%mod,belong[i]=(i-1)/block+1;for(int i=1;i<=N;i++) L[i]=(belong[i]-1)*block+1,R[i]=belong[i]*block;for(int i=1;i<=N;i++){int opt=read(),l=read(),r=read(),c=read()%mod;if(opt==0) Add(l,r,c);else if(opt==1) Mul(l,r,c);else if(opt==2) printf("%d\n",(a[r]*mul[belong[r]]+add[belong[r]])%mod);}return 0;
}

LOJ#6283. 数列分块入门 7相关推荐

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

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

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

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

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

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

  4. LOJ#6281. 数列分块入门 5

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

  5. loj #6278. 数列分块入门 2

    题目 题解 区间修改,询问区间小于c的个数.分块排序,用vector.至于那个块的大小,好像要用到均值不等式 我不太会...就开始一个个试,发现siz=sqrt(n)/4时最快!!!明天去学一下算分块 ...

  6. LOJ#6282. 数列分块入门 6

    一个动态的插入过程,还需要带有查询操作. 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把 ...

  7. LOJ 6281 数列分块入门 5

    Loj_6281 自己写分块时总是对于一个块内的修改写错 wa了好几次 自我感觉对于块内修改的操作,再封装一个函数是很方便的 #include <iostream> #include &l ...

  8. LOJ#6284. 数列分块入门 8

    分块的时候开一个数组标记这个区间是不是都是一样颜色的部分,如果是的话,我后面的查询,更新部分就可以直接整块操作,对于不是不全部都一样颜色的块在具体进到快里面去暴力. 在更新的时候对边上的两个不完整的块 ...

  9. 【分块】#6283. 数列分块入门 7(区间乘法、区间加法、单点查询)

    整理的算法模板合集: ACM模板 题目传送门 同线段树,维护的时候先乘再加. 要时刻注意懒惰标记的下标是块的编号!!! #include<cstdio> #include<algor ...

最新文章

  1. 希尔排序 - 数据结构和算法91
  2. 求一个集合的所有子集 Python实现
  3. UIBezierPath和CAShapeLayer画直线、CGContextRef画直线两种方案
  4. 怎么用js调用C#后台方法
  5. 设计模式学习之Factory Method模式和Abstract Factory模式
  6. gentoo ffmpeg+mencoder快速搭建视频处理系统笔记
  7. 一个CXF集成SPRING的WEBSERVICE完整实例
  8. Postfix+Mysql+Apache+Dovecot+Thunderbird+Extmail+E
  9. jvm 变量 内存分配
  10. IE下检测泄露的全局变量
  11. centos修改mysql数据库密码修改_centos7 mysql 修改数据库密码
  12. Sentinel控制台搭建使用
  13. C语言程序static改错题,2014计算机二级C语言程序设计全真测试题
  14. 【腾讯Bugly干货分享】腾讯验证码的十二年
  15. wireshark抓包使用与过滤方法
  16. java 命令: jmap 命令使用 ( 查看内存使用、设置 )
  17. 手机adb调试出现Not running as root. Try“adb root“ first.
  18. linux 串口 设置rts,linux内核关于uart2配置为RTS引脚时,串口无法使用的问题
  19. 金融学学习笔记第2章
  20. 分类目录站和网址导航站的区别

热门文章

  1. build unity 丢失_【厚积薄发】Unity 2017打包iOS版本参数丢失
  2. 某储云商城系统源码V1.782 绿色版
  3. 电脑DNS优选网络加速工具 可以提高网速
  4. iis mysql cpu_[译]通过IIS Request Filtering解决SQL Server CPU高的问题
  5. html5视频播放事件相关
  6. 在线阅读试听视频小程序模板源码
  7. 轻量在线人工客服系统 支持多商家+自动适配移动端
  8. 数据库访问的性能问题与瓶颈问题【z】
  9. jQuery Ajax 方法调用 Asp.Net WebService 的详细例子
  10. Repeater控件绑定数据、分页、数据操作,最佳代码