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 ...
随机推荐
- python 高级函数
高级函数 map 格式:map(func, lt) 说明:接受两个参数,一个函数和一个可迭代对象,返回一个生成器,将func依次作用于lt 示例: l = [1,2,3,4,5]def double ...
- List的Select 和Select().tolist()
List<Person> delp = new List<Person> { ,Name=,Sign= }, ,Name= ,Sign=}, }; delp.Select(u ...
- 解决GitHub添加sshkey仍然无法访问clone远程仓库的问题
1 ssh -v git@github.com 通过这个命令打印调试信息 ebug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS rece ...
- 3.1.2-arm-linux-ld选项
有文件link.S,内容如下 .text .global _start _start: b step1 step1: ldr pc, =step2 step2: b step2 经过如下命令编译 ar ...
- Jmeter 常见逻辑控制器详解
简介 Jmeter有很多逻辑控制器,可以控制请求的执行顺序和执行逻辑,本文就Jmeter常见的逻辑控制器做一个详细的描述,并通过示例让大家了解逻辑控制器的作用. 代码的逻辑分支通常有: 条件判断I ...
- PAT Basic 1014 福尔摩斯的约会 (20 分)
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...
- springboot中使用filter
通过注解的方式实现filter过滤器. 创建Filter包,并在该包下创建MyFilter 示例代码: package com.bjpowernode.springboot.filter; impor ...
- 批处理清除svn版本信息
for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"
- Mongodb的mapreduce
简单的看了一下mapreduce,我尝试不看详细的api去做一个group效果,结果遇到了很多问题,罗列在这里,如果别人也遇到了类似的bug,可以检索到结果. //先看person表的数据 > ...
- 简单加密 DEncrypt
/// <summary> /// Encrypt 的摘要说明. /// </summary> public class DEncrypt { /// <summary& ...