题目: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. OpenStack安装CentOS镜像:Device eth0 does not seem to be present, delaying initialization

    解决办法:删除 /etc/udev/rules.d/70-persistent-net.rules 后重启机器.70-persistent-net.rules这个文件确定了网卡与MAC地址的绑定,cl ...

  2. access变转换为mysql表工具

    1.一个是国外软件,名字叫Access2MySQL,下载地址:http://www.pc6.com/softview/SoftView_7187.html 2.第二款软件是月光博客写的一个小软件:DB ...

  3. Android UI开发第四十三篇——使用Property Animation实现墨迹天气3.0引导界面及动画实现

    前面写过<墨迹天气3.0引导界面及动画实现>,里面完美实现了动画效果,那一篇文章使用的View Animation,这一篇文章使用的Property Animation实现.Propert ...

  4. 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基

    [BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...

  5. intellij idea 大内存优化配置 idea64.exe.vmoptions文件配置

    -ea-server-Xms2G-Xmx4096M-Xss2m-XX:MaxMetaspaceSize=2G-XX:ReservedCodeCacheSize=1G-XX:MetaspaceSize= ...

  6. 【题解】P4886快递员

    [题解]P4886 快递员 淀粉质好题!!!加深了我对点分治的理解.最近分治学了好多啊. 题目大意 给定你一颗有边权的树,再给你\(m\)和点对,请你在树上选出来一个点,使得所有点对到这个点的距离的最 ...

  7. No provisioned iOS devices are available with a compatible iOS version. Connect an iOS device with a

    No provisioned iOS devices are available with a compatible iOS version. Connect an iOS device with a ...

  8. 使用urllib2打开网页的三种方法(Python2)

    python2才有urllib2模块,python3把urllib和urllib2封装成了urllib模块 使用urllib2打开网页的三种方法 #coding:utf-8 import urllib ...

  9. ubuntu在vim里搜索关键字

    在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 “/” 然后输入你要查找的关键字敲回车就可以了. 如果你要继续查找此关键字,敲字符 n 就可以继续查找了.

  10. qemu仿真执行uboot和barebox

    先安装qemu: apt-get install qemu-system 交叉编译器可以选择友善之臂:http://arm9download.cncncn.com/mini2440/linux/arm ...