数据结构:分块-区间加法、区间乘法和单点查询
这里问题的关键是妥善处理好两种标记
让乘法标记的优先级高于加法
若当前的一个块乘以m1后加上a1,这时进行一个乘m2的操作,则原来的标记变成m1*m2,a1*m2
若当前的一个块乘以m1后加上a1,这时进行一个加a2的操作,则原来的标记变成m1,a1+a2
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 const int maxn=100005; 6 const int mod=10007; 7 int n,blo; 8 int v[maxn],bl[maxn],atag[1005],mtag[1005]; 9 long long read() 10 { 11 long long x=0,f=1;char ch=getchar(); 12 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 void reset(int x) 17 { 18 for(int i=(x-1)*blo+1;i<=min(n,x*blo);i++) 19 v[i]=(v[i]*mtag[x]+atag[x])%mod; 20 atag[x]=0;mtag[x]=1; 21 } 22 void solve(int f,int a,int b,int c) 23 { 24 reset(bl[a]); 25 for(int i=a;i<=min(bl[a]*blo,b);i++) 26 { 27 if(f==0) v[i]+=c; 28 else v[i]*=c; 29 v[i]%=mod; 30 } 31 if(bl[a]!=bl[b]) 32 { 33 reset(bl[b]); 34 for(int i=(bl[b]-1)*blo+1;i<=b;i++) 35 { 36 if(f==0) v[i]+=c; 37 else v[i]*=c; 38 v[i]%=mod; 39 } 40 } 41 for(int i=bl[a]+1;i<=bl[b]-1;i++) 42 { 43 if(f==0) atag[i]=(atag[i]+c)%mod; 44 else 45 { 46 atag[i]=(atag[i]*c)%mod; 47 mtag[i]=(mtag[i]*c)%mod; 48 } 49 } 50 } 51 int main() 52 { 53 n=read();blo=sqrt(n); 54 for(int i=1;i<=n;i++) v[i]=read(); 55 for(int i=1;i<=n;i++) bl[i]=(i-1)/blo+1; 56 for(int i=1;i<=bl[n];i++) mtag[i]=1; 57 for(int i=1;i<=n;i++) 58 { 59 int f=read(),a=read(),b=read(),c=read(); 60 if(f==2) printf("%d\n",(v[b]*mtag[bl[b]]+atag[bl[b]])%mod); 61 else solve(f,a,b,c); 62 } 63 return 0; 64 }
转载于:https://www.cnblogs.com/aininot260/p/9525903.html
数据结构:分块-区间加法、区间乘法和单点查询相关推荐
- P3373 【模板】线段树 2(区间乘法+区间加法+区间求和)
题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,pn,m,p,分别表示该数 ...
- 几个线段树板子(区间加/区间加与乘)
一直仰慕dl能够把线段树玩出花来,所以就想手写并整理一下几个常见的线段树板子(主要是结构化得好看一些) Part Ⅰ区间加法+区间求和 洛谷P3372 基础中的基础 //luogu P3372 199 ...
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个长为 ...
- HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询
[题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给出一 ...
- 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询
如何将普通树状数组升级 普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起. 原来的值存在a[]里面,多建立个数组c1[],注意:c1[i]=a[i]-a[i-1]. 那么求a[i]的值的时候a ...
- 【分块】#6277. 数列分块入门 1(区间修改、单点查询)
整理的算法模板合集: ACM模板 题目传送门 题解by hzwer 区间修改实际上就分情况暴力枚举修改即可.单点查询直接输出,因为我们就是直接维护的一个数组. #pragma GCC optimize ...
- 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结
文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...
- 2015 UESTC 数据结构专题A题 秋实大哥与小朋友 线段树 区间更新,单点查询,离散化...
秋实大哥与小朋友 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Desc ...
最新文章
- 02.Python基础
- centos7编译安装pure-ftpd-1.0.42
- 基于JAVA+Servlet+JSP+MYSQL的会议管理系统
- node.js-session问题
- Flutter入门——山寨掘金(二)
- Linux下tomcat的catalina.out文件过大,以及目录更改解决办法
- Squid 配置文件详解
- StartHS(截图软件)v6.81.02绿色汉化版
- editormd图片编辑( 结合SpringBoot 实现)
- Redis发布订阅[西橙先生]
- NLP入门(十)使用LSTM进行文本情感分析
- 基于stm32的自动循迹及自动搬运物联网图传小车
- 【夜读】影响一生的五大定律
- 关于工业级GPU C-model所使用的性能模拟器(preformance simulator)
- getsockopt( )函数详解
- Java 学习 - 全文索引 - Lucene
- 【归档】爬取马蜂窝景点信息(含源代码)
- php正则数字是否靓号,数字靓号正则表达式
- 数组名 int a[5] = {1,2,3,4,5}; int *ptr = (int *)( a + 1);
- quick-cocos 集成ShareSDK