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. JS代码格式化

    JS代码格式化也就是规范化,保留必要的换行和缩进使代码阅读起来更容易.团队协同工作时会有相应的标准,大家要保证统一的代码风格,这样在合并代码的时候才不容易出问题.通过快捷键Ctrl+Shift+F进行 ...

  2. Caffe中im2col的实现解析

    这里,我是将Caffe中im2col的解析过程直接拉了出来,使用C++进行了输出,方便理解.代码如下: #include<iostream> using namespace std; bo ...

  3. Hbase性能优化

    HBase性能优化方法总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户 ...

  4. 用Ant实现Java项目的自动构建和部署(转载以作收藏)

    原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml        本文请勿转载! Ant是一个Apache基金会下的跨平台的构件 ...

  5. TO B是什么?TO C呢?

    总是听别人说 to B. to C 的 所以了解一下这个概念: 一.基本概念   1. TO B,B指的是== business==,中文即商业,企业:   2. TO C,C指的是customer, ...

  6. centos7中使用yum安装tomcat mysql 等

    安装Tomcat 进入 # cd /usr/local/tomcat # wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7 ...

  7. django之路由层(反向解析)总结

    表关系的建立方式 表与表之间的关系就三种 一对一 OneToOne(to='') # to后面可以跟字符串的表名 也可以直接跟变量名表名(该表名必须在上面提前定义出来) 一对多 ForeignKey( ...

  8. SQL server 大量数据导入和系统运行慢的问题

    1.日常排查语句 --当前正在执行的语句 SELECT der.[session_id],der.[blocking_session_id], sp.lastwaittype,sp.hostname, ...

  9. Python实现ANSI文件转UTF-8

    ANSI编码的文件转为UTF-8编码的文件. # ANSI文件转UTF-8 import codecs import os # 文件所在目录 file_path = "H:\Python\S ...

  10. JS 全局作用域和局部作用域

    一.作用域 1.什么是作用域(Scope) 通常来说,一段程序代码中所用到的名字不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域. JS作用域:就是代码名字(变量)作用的范围 ...