洛谷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 求出某区间每一个数的和 输入格式 第一 ...
随机推荐
- Chrome自带恐龙小游戏的源码研究(四)
在上一篇<Chrome自带恐龙小游戏的源码研究(三)>中实现了让游戏昼夜交替,这一篇主要研究如何绘制障碍物. 障碍物有两种:仙人掌和翼龙.仙人掌有大小两种类型,可以同时并列多个:翼龙按高. ...
- 2009-04-19 22:40 SQL SERVER游标的讲解
游标和游标的优点 在数据库中,游标是一个十分重要的概念.游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结 果集中每次提取一条记录的机制.游标总 ...
- php正则表达式匹配img中任意属性的方法
经常和图片打交道,不得不用到一些提取图片中scr.alt.title.等的属性,这里总结给大家一些常用的,感觉还不错,比较通用! PHP正则表达式匹配img中任意属性PHP 复制代码代码如下: < ...
- RRDTool详解(转)
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.http://freeloda.blog.51cto.com/2033581/1307492 大纲 ...
- 用Newtonsoft将json串转为对象的方法(详解)
首先,将json串转为一个JObject对象: JObject jo = (JObject)JsonConvert.DeserializeObject(CurrentSelectedItemReq) ...
- 转载 ---原生和H5交互挺多的,最近也有朋友再问。这儿我写个简单的例子给大家 直接贴代码 js的
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...
- js 获取地理位置经纬度
1. 加载百度API的核心js,ak表示获取百度地图的开发密钥,免费的需要申请下 <script type="text/javascript" src="http: ...
- winserver 资源下载
http://msdn.itellyou.cn/ 下载各种系统资源,支持迅雷下载,速度杠杠的
- nodejs 版本dockerfile 文件制作,和常用命令
Dockerfile 如下 官方的node6.3的版本有点难下载,建议去网易蜂巢 https://c.163.com/hub pull hub.c.163.com/library/node:6.9 ...
- 【Windows】修改远程桌面端口号
echo off echo 修改远程连接端口 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Se ...