这里问题的关键是妥善处理好两种标记

让乘法标记的优先级高于加法

若当前的一个块乘以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

数据结构:分块-区间加法、区间乘法和单点查询相关推荐

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

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

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

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

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

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

  4. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

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

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

  6. 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询

    如何将普通树状数组升级 普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起. 原来的值存在a[]里面,多建立个数组c1[],注意:c1[i]=a[i]-a[i-1]. 那么求a[i]的值的时候a ...

  7. 【分块】#6277. 数列分块入门 1(区间修改、单点查询)

    整理的算法模板合集: ACM模板 题目传送门 题解by hzwer 区间修改实际上就分情况暴力枚举修改即可.单点查询直接输出,因为我们就是直接维护的一个数组. #pragma GCC optimize ...

  8. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  9. 2015 UESTC 数据结构专题A题 秋实大哥与小朋友 线段树 区间更新,单点查询,离散化...

    秋实大哥与小朋友 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Desc ...

最新文章

  1. 02.Python基础
  2. centos7编译安装pure-ftpd-1.0.42
  3. 基于JAVA+Servlet+JSP+MYSQL的会议管理系统
  4. node.js-session问题
  5. Flutter入门——山寨掘金(二)
  6. Linux下tomcat的catalina.out文件过大,以及目录更改解决办法
  7. Squid 配置文件详解
  8. StartHS(截图软件)v6.81.02绿色汉化版
  9. editormd图片编辑( 结合SpringBoot 实现)
  10. Redis发布订阅[西橙先生]
  11. NLP入门(十)使用LSTM进行文本情感分析
  12. 基于stm32的自动循迹及自动搬运物联网图传小车
  13. 【夜读】影响一生的五大定律
  14. 关于工业级GPU C-model所使用的性能模拟器(preformance simulator)
  15. getsockopt( )函数详解
  16. Java 学习 - 全文索引 - Lucene
  17. 【归档】爬取马蜂窝景点信息(含源代码)
  18. php正则数字是否靓号,数字靓号正则表达式
  19. 数组名 int a[5] = {1,2,3,4,5}; int *ptr = (int *)( a + 1);
  20. quick-cocos 集成ShareSDK

热门文章

  1. bootstrap 辅助类
  2. 区别Transform、Transition、Animation
  3. 桦仔 笔记3-徐 设置数据库自动增长注意要点
  4. iOS 5 编程(1)-图像视图、滑块和步进控件的使用(源码下载)
  5. 郁闷好久的电脑问题终于搞定---电脑经常死机
  6. IT职场健康杀手与应对宝典 (虽然是IT职场,可是对于常上网的ggmm也是很有用的)...
  7. flutter底部导航栏
  8. 精通Android自定义View(十二)绘制圆形进度条
  9. java中的多线程来看一看基础了
  10. sublime text3常用的一些快捷键