P3373 【模板】线段树 2 (未完待续)
P3373 【模板】线段树 2
强烈安利这个大佬 超赞!!!
题解
本来以为这个题拿着线段树1的板子改改就好了,但是发现事情并没有那么简单,改了两天。。。
我们看到这个题其实涉及啦乘法和加法两种运算,如何把这两种运算同时塞到懒标记当中呢??似乎有些困难
!!!那么我们可以开两个懒标记啊,一个记录乘法mul[ ],一个记录加法add[ ]
初始化
add[ ] 初始化当然为0,不加减任何数
mul[ ] 初始化当然为1 ,不乘任何数
标记下传以及ADD运算的时候两者都要维护
运算顺序
当我们乘法和加法的懒标记都有的时候
是先加后乘呢?
还是先乘后加呢?
ans:先乘后加
注意
这个题数据算着算着就很大了,一定要都开long long
还有一点就是忽略掉 if (add [ ] ==0)
代码
#include<bits/stdc++.h> using namespace std; #define ll long long //一定要开long long ,不然会炸
const int maxn=1e7+;
ll n,m,x,y,v,opr,mod;
ll a[maxn],add[maxn*],mul[maxn*];
//add[]加法懒标记,mul[]乘法懒标记
ll sum[maxn*];
//前缀和
ll ans; void build(ll k,ll l,ll r) //建树
{
mul[k]=; //初始化乘法前缀和为1,表示不变
if(l==r)
{
sum[k]=a[l]; return ;
}
ll mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
sum[k]=(sum[k<<]+sum[k<<|])%mod;
} void Add(ll k,ll l,ll r,ll mulp,ll sump) //处理懒标记,先乘后加
{
sum[k]=(sum[k]*mulp+(r-l+)*sump)%mod;
add[k]=(add[k]*mulp+sump)%mod;
mul[k]=(mul[k]*mulp)%mod;
} void pushdown(ll k,ll l,ll r,ll mid) //标记下传
{
// if(add[k]==0) return ;
Add(k<<,l,mid,mul[k],add[k]);
Add(k<<|,mid+,r,mul[k],add[k]);
add[k]=; //清空懒标记
mul[k]=;
} void modifymul(ll k,ll l,ll r,ll x,ll y,ll v) //乘法区间修改
{
if(x<=l&&r<=y) return Add(k,l,r,v,);
ll mid=(l+r)>>;
pushdown(k,l,r,mid);
if(x<=mid) modifymul(k<<,l,mid,x,y,v);
if(mid<y) modifymul(k<<|,mid+,r,x,y,v);
sum[k]=(sum[k<<]+sum[k<<|])%mod; //维护前缀和
} void modifysum(ll k,ll l,ll r,ll x,ll y,ll v) //加法区间修改
{
if(x<=l&&r<=y) return Add(k,l,r,,v);
ll mid=(l+r)>>;
pushdown(k,l,r,mid);
if(x<=mid) modifysum(k<<,l,mid,x,y,v);
if(mid<y) modifysum(k<<|,mid+,r,x,y,v);
sum[k]=(sum[k<<]+sum[k<<|])%mod;
} long long query(ll k,ll l,ll r,ll x,ll y) //区间询问
{
if(x<=l&&r<=y) return sum[k];
ll mid=(l+r)>>;
ll res=;
pushdown(k,l,r,mid);
if(x<=mid) res+=query(k<<,l,mid,x,y);
if(mid<y) res+=query(k<<|,mid+,r,x,y);
return res%mod;
} int main()
{
scanf("%ld%ld%ld",&n,&m,&mod);
for(ll i=;i<=n;i++)
scanf("%ld",&a[i]); build(,,n); for(ll i=;i<=m;i++)
{
scanf("%ld%ld%ld",&opr,&x,&y);
if(opr==)
{
scanf("%ld",&v);
modifymul(,,n,x,y,v);
}
if(opr==)
{
scanf("%ld",&v);
modifysum(,,n,x,y,v);
}
if(opr==)
{
ans=query(,,n,x,y);
printf("%ld\n",ans%mod);
}
} return ;
}
P3373 【模板】线段树 2 (未完待续)的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 关于DOM的一些总结(未完待续......)
DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- Unity3D架构设计NavMesh寻路(未完待续)
国庆闲来没事把NavMesh巩固一下.以Unity3D引擎为例写一个底层c# NavMesh寻路.由于Unity3D中本身自带的NavMesh寻路不能非常好的融入到游戏项目其中,所以重写一个NavMe ...
- 数据库索引(Index)【未完待续】
数据库索引是啥?有什么用?原理是什么?最佳实践什么? 索引是啥 一个索引是这样的数据结构:从数据上来说,不仅包含了从表中某一列或多列的数据拷贝,同时,还包含了指向这列数据行的链接: 从结构上来说,索引 ...
- 堆学习笔记(未完待续)(洛谷p1090合并果子)
上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补: ——————来自百度百科 所 ...
- javascript有用小功能总结(未完待续)
1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 我的SQL总结---未完待续
我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...
- virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)
virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...
随机推荐
- Nginx安装目录详解
Nginx安装目录详解 1. 查看有关nginx的所有目录列表,输入命令 rpm -ql nginx 可以查看有关nginx目录信息,但是注意 这种命令只能是在基于yum安装的方式才可以. 2. 下 ...
- Delphi Button组件
- Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片
Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...
- iOS中为控件设置颜色渐变和透明度渐变
项目中用到地图设置渐变色,查找资料找到两种方法:一种设置颜色,一种设置透明度: //为颜色设置渐变效果: UIView *view = [[UIView alloc] initWithFrame:CG ...
- Redis和Memcache对比及选择(转载)
原文地址:http://blog.csdn.net/sunmenggmail/article/details/36176029 没有必要过多的关注性能.由于Redis只使用单核,而Memcached可 ...
- Java Pattern和Matcher字符匹配详解
http://tool.oschina.net/uploads/apidocs/jquery/regexp.html https://blog.csdn.net/rentian1/article/de ...
- linux 下mysql忘记密码或者安装好linux后不知道mysql初始密码解决方案
1.使用yum安装mysql后 2.初始密码在/var/log/mysqld.log这个文件里 3.输入命令:grep 'temporary password' /var/log/mysqld.log ...
- MYSQL数据库事务4种隔离级别及7种传播行为
事务的特性: 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割. 一致性:事务执行的前后,数据完整性保持一致. 隔离性:事务执行不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数 ...
- MySQL user表初始化
默认安装的MySQL数据库,无法远程连接. 登录MySQL之后,运行 SELECT user,host from mysql.user; 如果只有一条记录,说明是这个原因. 将下面的脚本保存成user ...
- 京东POP店铺使用京东物流,如何拦截订单
先进入物流工作台:https://wl.jdwl.com/ 然后操作中心-销售订单查询 然后点击展开按钮 粘贴要查询的订单号 勾选订单,点击取消按钮