洛谷P3373线段树模板2
题目:https://www.luogu.org/problemnew/show/P3373
带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加。
代码如下:
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int const N=;
int n,m,p;
ll t[N<<],lc[N<<],lj[N<<],a[N<<];
void pushup(int x)
{
t[x]=(t[x<<]+t[x<<|])%p;
}
void pushdown(int l,int r,int x)
{
int ls=(x<<),rs=(x<<|);
int mid=(l+r)/; t[ls]*=lc[x];t[ls]+=lj[x]*(mid-l+);//!
t[rs]*=lc[x];t[rs]+=lj[x]*(r-mid);//! lj[ls]*=lc[x];lj[ls]+=lj[x];
lj[rs]*=lc[x];lj[rs]+=lj[x];
lc[ls]*=lc[x];lc[rs]*=lc[x];
lj[x]=;lc[x]=; t[ls]%=p;t[rs]%=p;
lj[ls]%=p;lj[rs]%=p;
lc[ls]%=p;lc[rs]%=p;
}
void build(int l,int r,int x)
{
lc[x]=;lj[x]=;
if(l==r)
{
t[x]=a[l];
return;
}
int mid=(l+r)/;
build(l,mid,x<<);
build(mid+,r,x<<|);
pushup(x);
}
void update(int l,int r,int L,int R,int s,int tp,int x)
{
if(tp==)//c
{
if(l>=L&&r<=R)
{
lj[x]=(lj[x]*s)%p;
lc[x]=(lc[x]*s)%p;
t[x]=(t[x]*s)%p;
return;
}
pushdown(l,r,x);
int mid=(l+r)/;
if(mid>=L)update(l,mid,L,R,s,tp,x<<);
if(mid<R)update(mid+,r,L,R,s,tp,x<<|);
pushup(x);
}
if(tp==)//j
{
if(l>=L&&r<=R)
{
lj[x]=(lj[x]+s)%p;
t[x]=(t[x]+s*(r-l+))%p;//!
return;
}
pushdown(l,r,x);
int mid=(l+r)/;
if(mid>=L)update(l,mid,L,R,s,tp,x<<);
if(mid<R)update(mid+,r,L,R,s,tp,x<<|);
pushup(x);
}
}
ll query(int l,int r,int L,int R,int x)
{
if(l>=L&&r<=R)return t[x];
pushdown(l,r,x);
int mid=(l+r)/,ans=;
if(mid>=L)ans=(ans+query(l,mid,L,R,x<<))%p;
if(mid<R)ans=(ans+query(mid+,r,L,R,x<<|))%p;
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
build(,n,);
while(m--)
{
int x,y,k,j;
scanf("%d",&j);
if(j==)
{
scanf("%d%d%d",&x,&y,&k);
update(,n,x,y,k,,);
}
if(j==)
{
scanf("%d%d%d",&x,&y,&k);
update(,n,x,y,k,,);
}
if(j==)
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(,n,x,y,)%p);
}
}
return ;
}
洛谷P3373线段树模板2的更多相关文章
- 洛谷P3372线段树模板1——线段树
题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...
- 洛谷P3373 线段树2(补上注释了)
毒瘤题.找了一下午+晚上的BUG,才发现原来query_tree写的是a%p; 真的是一个教训 UPD:2019.6.18 #include<iostream> #include<c ...
- 洛谷3372线段树模板题 对区间+k或者查询区间和
#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...
- P3373 线段树模板
好,这是一个线段树模板. #include <cstdio> using namespace std; ; long long int sum[N],tag1[N],tag2[N],mo; ...
- 洛谷P3372线段树1
难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...
- NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...
- 洛谷 P3372 线段树1
这是一道模板题 线段树介绍https://www.cnblogs.com/nvwang123/p/10420832.html #include<bits/stdc++.h> using n ...
- 洛谷 P3373:【模板】线段树 2(区间更新)
题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别 ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
随机推荐
- Spring Security实现短信验证码登录
Spring Security默认的一个实现是使用用户名密码登录,当初我们在开始做项目时,也是先使用这种登录方式,并没有多考虑其他的登录方式.而后面需求越来越多,我们需要支持短信验证码登录了,这时候再 ...
- uva 11404 dp
UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串.他可能是[l+1, r] 和[ ...
- iis出现HTTP 错误 403.14 - Forbidden Web问题
找到"目录浏览",并"应用"
- [转]浅谈Flash Socket通信安全沙箱
用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无 ...
- PHP服务端如何通过程序将图上传到指定的图片服务器与图片服务器的优化方案
一:PHP服务端如何通过程序将图上传到指定的图片服务器与图片服务器的优化方案 (1) php服务器把图片处理成缩率图或指定大小的图片在通过PHP程序代码 操作FTP 上传到图片服务器. 二:图片服务器 ...
- android 底部菜单栏实现(转)
1.Android学习之BottomNavigationBar实现Android特色底部导航栏 2.Android底部导航栏的四种实现 3.Android BottomNavigationBar底部导 ...
- [转]Unity3D Editor 编辑器简易教程
Star 自定义编辑器简易教程 an introduction to custom editors 原文地址 http://catlikecoding.com/unity/tutorials/star ...
- Linux 开启端口,操作防火墙
命令行方式: 添加10002端口方法 1.vi etc/sysconfig/iptables 2. 开放端口命令:-A INPUT -p tcp -m state --state NEW -m ...
- [转]Struts form传值
Struts form传值 大约三四个月没用过struts框架,突然想拾起来,却发现好多都忘了.出现传值传不过来的问题.没办法,上网查了一下,看见了一位老师的帖子,总结的很好.特此转载与分享,文末附链 ...
- 如果这种方式导致程序明显变慢或者引起其他问题,我们要重新思考来通过 goroutines 和 channels 来解决问题
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/09.3.md 9.3 锁和 sync 包 在一些复杂的程序中,通常通 ...