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 (未完待续)的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  2. 关于DOM的一些总结(未完待续......)

    DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...

  3. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  4. Unity3D架构设计NavMesh寻路(未完待续)

    国庆闲来没事把NavMesh巩固一下.以Unity3D引擎为例写一个底层c# NavMesh寻路.由于Unity3D中本身自带的NavMesh寻路不能非常好的融入到游戏项目其中,所以重写一个NavMe ...

  5. 数据库索引(Index)【未完待续】

    数据库索引是啥?有什么用?原理是什么?最佳实践什么? 索引是啥 一个索引是这样的数据结构:从数据上来说,不仅包含了从表中某一列或多列的数据拷贝,同时,还包含了指向这列数据行的链接: 从结构上来说,索引 ...

  6. 堆学习笔记(未完待续)(洛谷p1090合并果子)

    上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补: ——————来自百度百科 所 ...

  7. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  8. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  9. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  10. virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)

    virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...

随机推荐

  1. Nginx安装目录详解

    Nginx安装目录详解 1. 查看有关nginx的所有目录列表,输入命令  rpm -ql nginx 可以查看有关nginx目录信息,但是注意 这种命令只能是在基于yum安装的方式才可以. 2. 下 ...

  2. Delphi Button组件

  3. Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片

    Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...

  4. iOS中为控件设置颜色渐变和透明度渐变

    项目中用到地图设置渐变色,查找资料找到两种方法:一种设置颜色,一种设置透明度: //为颜色设置渐变效果: UIView *view = [[UIView alloc] initWithFrame:CG ...

  5. Redis和Memcache对比及选择(转载)

    原文地址:http://blog.csdn.net/sunmenggmail/article/details/36176029 没有必要过多的关注性能.由于Redis只使用单核,而Memcached可 ...

  6. Java Pattern和Matcher字符匹配详解

    http://tool.oschina.net/uploads/apidocs/jquery/regexp.html https://blog.csdn.net/rentian1/article/de ...

  7. linux 下mysql忘记密码或者安装好linux后不知道mysql初始密码解决方案

    1.使用yum安装mysql后 2.初始密码在/var/log/mysqld.log这个文件里 3.输入命令:grep 'temporary password' /var/log/mysqld.log ...

  8. MYSQL数据库事务4种隔离级别及7种传播行为

    事务的特性: 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割. 一致性:事务执行的前后,数据完整性保持一致. 隔离性:事务执行不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数 ...

  9. MySQL user表初始化

    默认安装的MySQL数据库,无法远程连接. 登录MySQL之后,运行 SELECT user,host from mysql.user; 如果只有一条记录,说明是这个原因. 将下面的脚本保存成user ...

  10. 京东POP店铺使用京东物流,如何拦截订单

    先进入物流工作台:https://wl.jdwl.com/ 然后操作中心-销售订单查询 然后点击展开按钮 粘贴要查询的订单号 勾选订单,点击取消按钮