【JSOI2014】【BZOJ5039】序列维护(线段树模板)
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】序列维护(线段树模板)相关推荐
- 【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)
problem 给定一个长为n的序列,m次询问 每次询问有3种操作 1.一段区间全部乘一个值 2.一段区间全部加一个值 3.询问一段区间和%P solution 不就一颗线段树么,看朕10分钟A掉.. ...
- 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题
题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- 线段树模板题3:区间染色问题
1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...
- ACM算法-----线段树模板
上模板: const int MAX = 999999; struct treenode {int val;//树节点值int right, left;//左右区间 }tree[MAX]; int t ...
- hdu1156(简单线段树 模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 线段树模板hdu 1754:I Hate It
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 洛谷3373 线段树模板
题目详情:https://www.luogu.org/problemnew/show/P3373 这个线段树模板写的头疼(最后纠错发现一个long long没开差点一口血喷出来),思路就是在普通的求区 ...
- ccf除法-线段树模板
这题的要求是对区间处理,查询区间和,一看就是线段树模板题,下面是代码 #include<iostream> using namespace std; int pp[100001]; str ...
- Just a Hook(线段树模板)
题意 n个铜棒子,对其进行区间修改,将区间中的棒子价值增加,问最后所有棒子的总价值是多少. 铜棒:1 银棒:2 金棒:3 思路 线段树模板题 建树时,每个节点值都为1,对其进行区间修改 最后输出根节点 ...
最新文章
- ASP.NET中利用DataList实现图片无缝滚动
- 电纸书kindle相关产品调研(没搞完)
- java ee 导入项目_最代码网站java项目下载后遇到项目打开,导入,运行的问题QA汇总...
- 扫二维码缴违章停车罚款?骗你的!
- 用R进行文本挖掘与分析:分词、画词云
- 不想一直做码农的请进~
- java 英文题_java英文试题
- java反编译数组_JavaGuide/JAD反编译tricks.md at master · Github-Programer/JavaGuide · GitHub...
- HTML网页设计:二、网页的基本标签
- 小米原装系统镜像列表
- AOP(面向切面编程)
- kali攻击手机_kali linux入侵安卓手机
- 如何注册PayPal账户
- 【百度地图2.5D、3D在Vue项目中的使用】嵌入二维百度地图、三维百度地图、多种显示模式风格样式颜色的百度地图
- 跨境贸易EDM邮件使用指南
- HTML实现文件上传和HTML实现打开文件目录
- 解决Xcode真机测试时ineligible devices的问题
- 关于创建Word的实例化对象的80040154 没有注册类 解决方法。。。。求帮助求帮助
- 为什么程序员都这么邋遢?
- 大数据测试数据生成工具v1.0 --百万级别一键导出TXT,JSON,MYSQL 。---HIVE专属工具
热门文章
- 实用工具网站(经纬度、短链接、图片格式转换、长微博、图片压缩、uuid、繁体字、md5破解)
- Python 进阶 —— 使用修饰器执行函数的参数检查
- Git 基础(八)—— Github 的使用(账号管理)
- logback日志pattern_[SpringBoot2.X]28- Spring Boot 的日志管理
- python def函数参数_Python def函数的定义、使用及参数传递实现代码
- python官网的软件-mPython
- 精通python工资高吗-2020年10月程序员工资再创新高
- python使用-python 类如何使用
- python基础教程视频-python从入门到精通之30天快速学python视频教程
- 开课吧学python靠谱吗-开课吧成为CNCC中国计算机大会唯一教育合作伙伴