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 ...
随机推荐
- vue-时间插件,效果见图
<template> <div class="select-time-wrapper"> <h5 class="titie"> ...
- EF报错:对一个或多个实体的验证失败(Entity Framework 强制转换失败数据异常处理方法)
1.使用MVC和EF,在保存数据的时候报错:System.Data.Entity.Validation.DbEntityValidationException: 对一个或多个实体的验证失败.有关详细信 ...
- linux命令详解——sort
[原文链接]:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html 1 sort的工作原理 sort将文件的每一行作为一个单位, ...
- Ubuntu环境变量设置注意点
设置环境变量时,有一点要注意: /etc/bash.bashrc与/etc/profile是有区别的 什么区别呢? 打开一个新的shell时,会读取/etc/bash.bashrc和~/.bashrc ...
- centos 7 Network 脚本
#!/bin/sh #主动启动网卡 interface=$() ifup $interface #获取当前网络信息 default_route=$(ip route show) default_int ...
- Rasa学习记录 01
目录 Rasa的安装和简单的测试 什么是Rasa: 安装Rasa: 测试自带的数据 查看项目里的文件内容 举一反三(自己的第一个机器人) Rasa的安装和简单的测试 怪雨是新手,刚刚接触Rasa,以下 ...
- Python基础:元组
元组(tuple)特点: 1.元组是以圆括号“()”包围的数据集合,不同成员以“,”分隔.通过下标进行访问 2.不可变序列,可以看做不可变的列表,与列表不同:元组中数据一旦确立就不能改变(所以没有类似 ...
- 【2019.3.20】NOI模拟赛
题目 这里必须标记一下那个傻逼问题,再不解决我人就没了! 先放一个 $T3$ $20$ 分暴力 #include<bits/stdc++.h> #define rep(i,x,y) for ...
- hdu4405 概率dp
飞行棋游戏 问从0结束游戏的投色子次数期望是多少 设dp[i]表示i到n的期望,那么可以得到dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6] ...
- 背包 || NOIP 2018 D1 T2 || Luogu P5020 货币系统
题面:P5020 货币系统 题解: 显然要求的货币系统是当前货币系统的子集时答案会更优,于是考虑从当前货币系统中删数 一个大数如果能被其他小数表示出来,它就可以去掉 把数据排个序去个重,然后直接背包 ...