题目: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的更多相关文章

  1. 洛谷P3372线段树模板1——线段树

    题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...

  2. 洛谷P3373 线段树2(补上注释了)

    毒瘤题.找了一下午+晚上的BUG,才发现原来query_tree写的是a%p; 真的是一个教训 UPD:2019.6.18 #include<iostream> #include<c ...

  3. 洛谷3372线段树模板题 对区间+k或者查询区间和

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  4. P3373 线段树模板

    好,这是一个线段树模板. #include <cstdio> using namespace std; ; long long int sum[N],tag1[N],tag2[N],mo; ...

  5. 洛谷P3372线段树1

    难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...

  6. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  7. 洛谷 P3372 线段树1

    这是一道模板题 线段树介绍https://www.cnblogs.com/nvwang123/p/10420832.html #include<bits/stdc++.h> using n ...

  8. 洛谷 P3373:【模板】线段树 2(区间更新)

    题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别 ...

  9. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

随机推荐

  1. 贷前系统ElasticSearch实践总结

    贷前系统负责从进件到放款前所有业务流程的实现,其中涉及一些数据量较大.条件多样且复杂的综合查询,引入ElasticSearch主要是为了提高查询效率,并希望基于ElasticSearch快速实现一个简 ...

  2. ssh port forwarding

    SSH端口转发,总是忘记,今天记录下.端口转发有两种,一个是local一个是remote(可能还有一种dynamic,还没有研究) 贴个链接 https://www.ssh.com/ssh/tunne ...

  3. Space is not allowed after parameter prefix ':'

    问题:在hibernate中执行mysql语句,如果mysql语句中含有@a := 1 之类的变量,回报这个错误 语句类似于“set @rownum=0, @preval=null; select @ ...

  4. 迁移,移动.vagrant.d目录

    默认在 C:\Users\***\.vagrant.d 然后下面有boxes目录 想迁移到其它目录 setx VAGRANT_HOME "/d/.vagrant.d/" setx ...

  5. 模式识别之svm()---支持向量机svm 简介1995

    转自:http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html 作者:Jasper 出自:http://www.blogjav ...

  6. 【PHP开发】ThinkPHP3.1.3问题集及解决方法

    Outline: 无法获取post请求中的url参数的问题 中文存入数据表后为空字符串 1. 无法获取post请求中的url参数的问题 ThinkPHP3.1.3中,如果提交的post请求中,如果要在 ...

  7. Executors几种常用的线程池性能比较

    java编程中,经常会利用Executors的newXXXThreasPool生成各种线程池,今天写了一小段代码,简单测试了下三种常用的线程池: import com.google.common.ut ...

  8. bash学习记录

    bash: 管理员:  提示符# 普通用户:提示符$ 环境变量 A=3(变量是指内存空间,A指的是内存空间的名称-变量标示符) PS1  \u@\h:\w\$  \u用户名 \h主机名 \w工作目录的 ...

  9. Java泛型【转】

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...

  10. ajax工作原理(转)

    在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...