problem

已知一个数列,你需要进行下面三种操作:
1.将某区间每一个数乘上x
2.将某区间每一个数加上x
3.求出某区间每一个数的和

solution

区间修改+区间查询。
维护两个LazyTag

codes

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100010;
typedef long long LL;int n, m;
LL a[maxn],mod;
struct node{int l, r;LL val, addmark, mulmark;
}sgt[maxn<<2];
void build(int p, int l, int r){sgt[p].l = l, sgt[p].r = r;sgt[p].mulmark=1, sgt[p].addmark=0;if(l == r){sgt[p].val = a[l];}else{int m = (l+r)/2;build(p*2,l,m);build(p*2+1,m+1,r);sgt[p].val = sgt[p*2].val+sgt[p*2+1].val;}sgt[p].val %= mod;
}
void pushdown(int p){if(sgt[p].addmark==0&&sgt[p].mulmark==1)return ;//初始化父节点LL t1 = sgt[p].addmark, t2 = sgt[p].mulmark;sgt[p].addmark = 0, sgt[p].mulmark = 1;//维护标记sgt[p*2].mulmark = (sgt[p*2].mulmark*t2)%mod;sgt[p*2+1].mulmark = (sgt[p*2+1].mulmark*t2)%mod;sgt[p*2].addmark = (sgt[p*2].addmark*t2+t1)%mod;sgt[p*2+1].addmark = (sgt[p*2+1].addmark*t2+t1)%mod;//更新当前值,我们规定乘法优先更新(加法优先会损失精度)int l = sgt[p].l, r = sgt[p].r, m = (l+r)/2;sgt[p*2].val=(sgt[p*2].val*t2+t1*(m-l+1))%mod;//先乘以乘法标记再加上已用乘法标记更新过的加法标记。sgt[p*2+1].val=(sgt[p*2+1].val*t2+t1*(r-m))%mod;
}
void add(int p, int l, int r, LL v){if(l <= sgt[p].l && sgt[p].r <= r){sgt[p].val = (sgt[p].val+(sgt[p].r-sgt[p].l+1)*v)%mod;sgt[p].addmark = (sgt[p].addmark+v)%mod;return ;}pushdown(p);int m = (sgt[p].l+sgt[p].r)/2;if(l <= m)add(p*2,l,r,v);if(r > m)add(p*2+1,l,r,v);sgt[p].val = (sgt[p*2].val+sgt[p*2+1].val)%mod;
}
void times(int p, int l, int r, LL v){if(l <= sgt[p].l && sgt[p].r <= r){sgt[p].val = (sgt[p].val*v)%mod;sgt[p].mulmark = (sgt[p].mulmark*v)%mod;sgt[p].addmark = (sgt[p].addmark*v)%mod;//原先的加法标记也要乘return ;}pushdown(p);int m = (sgt[p].l+sgt[p].r)/2;if(l <= m)times(p*2,l,r,v);if(r > m)times(p*2+1,l,r,v);sgt[p].val = (sgt[p*2].val+sgt[p*2+1].val)%mod;
}
LL query(int p, int l, int r){if(l <= sgt[p].l && sgt[p].r <= r)return sgt[p].val;pushdown(p); //pushdownLL m = (sgt[p].l+sgt[p].r)/2, ans = 0;if(l <= m)ans += query(p*2,l,r);if(r > m)ans += query(p*2+1,l,r);return ans%mod;
}int main(){ios::sync_with_stdio(false);cin>>n>>mod;for(int i = 1; i <= n; i++)cin>>a[i];build(1,1,n);cin>>m;for(int i = 1; i <= m; i++){int op;  cin>>op;if(op == 1){LL x, y, z;  cin>>x>>y>>z;times(1,x,y,z);}else if(op == 2){LL x, y, z;  cin>>x>>y>>z;add(1,x,y,z);}else{LL x, y;  cin>>x>>y;cout<<query(1,x,y)%mod<<"\n";}}return 0;
}

【JSOI2014】【BZOJ5039】序列维护(线段树模板)相关推荐

  1. 【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)

    problem 给定一个长为n的序列,m次询问 每次询问有3种操作 1.一段区间全部乘一个值 2.一段区间全部加一个值 3.询问一段区间和%P solution 不就一颗线段树么,看朕10分钟A掉.. ...

  2. 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题

    题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...

  3. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

  4. 线段树模板题3:区间染色问题

    1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...

  5. ACM算法-----线段树模板

    上模板: const int MAX = 999999; struct treenode {int val;//树节点值int right, left;//左右区间 }tree[MAX]; int t ...

  6. hdu1156(简单线段树 模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. 线段树模板hdu 1754:I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. 洛谷3373 线段树模板

    题目详情:https://www.luogu.org/problemnew/show/P3373 这个线段树模板写的头疼(最后纠错发现一个long long没开差点一口血喷出来),思路就是在普通的求区 ...

  9. ccf除法-线段树模板

    这题的要求是对区间处理,查询区间和,一看就是线段树模板题,下面是代码 #include<iostream> using namespace std; int pp[100001]; str ...

  10. Just a Hook(线段树模板)

    题意 n个铜棒子,对其进行区间修改,将区间中的棒子价值增加,问最后所有棒子的总价值是多少. 铜棒:1 银棒:2 金棒:3 思路 线段树模板题 建树时,每个节点值都为1,对其进行区间修改 最后输出根节点 ...

最新文章

  1. ASP.NET中利用DataList实现图片无缝滚动
  2. 电纸书kindle相关产品调研(没搞完)
  3. java ee 导入项目_最代码网站java项目下载后遇到项目打开,导入,运行的问题QA汇总...
  4. 扫二维码缴违章停车罚款?骗你的!
  5. 用R进行文本挖掘与分析:分词、画词云
  6. 不想一直做码农的请进~
  7. java 英文题_java英文试题
  8. java反编译数组_JavaGuide/JAD反编译tricks.md at master · Github-Programer/JavaGuide · GitHub...
  9. HTML网页设计:二、网页的基本标签
  10. 小米原装系统镜像列表
  11. AOP(面向切面编程)
  12. kali攻击手机_kali linux入侵安卓手机
  13. 如何注册PayPal账户
  14. 【百度地图2.5D、3D在Vue项目中的使用】嵌入二维百度地图、三维百度地图、多种显示模式风格样式颜色的百度地图
  15. 跨境贸易EDM邮件使用指南
  16. HTML实现文件上传和HTML实现打开文件目录
  17. 解决Xcode真机测试时ineligible devices的问题
  18. 关于创建Word的实例化对象的80040154 没有注册类 解决方法。。。。求帮助求帮助
  19. 为什么程序员都这么邋遢?
  20. 大数据测试数据生成工具v1.0 --百万级别一键导出TXT,JSON,MYSQL 。---HIVE专属工具

热门文章

  1. 实用工具网站(经纬度、短链接、图片格式转换、长微博、图片压缩、uuid、繁体字、md5破解)
  2. Python 进阶 —— 使用修饰器执行函数的参数检查
  3. Git 基础(八)—— Github 的使用(账号管理)
  4. logback日志pattern_[SpringBoot2.X]28- Spring Boot 的日志管理
  5. python def函数参数_Python def函数的定义、使用及参数传递实现代码
  6. python官网的软件-mPython
  7. 精通python工资高吗-2020年10月程序员工资再创新高
  8. python使用-python 类如何使用
  9. python基础教程视频-python从入门到精通之30天快速学python视频教程
  10. 开课吧学python靠谱吗-开课吧成为CNCC中国计算机大会唯一教育合作伙伴