洛谷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 求出某区间每一个数的和 输入格式 第一 ...
随机推荐
- 如何创建RESTFul Web服务
想写这篇文章很久了,这是个大话题,不是一时半会就能说清楚的. 所以准备花个一星期整理资料,把思路理清楚,然后再在Team里做个sharing:) 其实RESTFul是架构风格,并不是实现规范,也不一定 ...
- matlab中文显示乱码:控制台上的,编辑器的,图片中的
问题:matlab脚本与函数文件的中文注释显示乱码. 环境:matlab R2016a.Windows 10 home. 解决方案: step1 检查locale值 matlab命令行键入命令 fea ...
- Java 集成域登陆
参考: 1. JAVA中使用jcifs集成AD域用户认证 2. https://liaosy.iteye.com/blog/1887092 3.其他库 https://github.com/Waffl ...
- 【BZOJ4826】[Hnoi2017]影魔 单调栈+扫描线
[BZOJ4826][Hnoi2017]影魔 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝 ...
- python cookbook第三版学习笔记五:datetime
Python中表示时间的模块是datetime,引入下面的模块 from datetime import datetime,timedelta print datetime.today() #打印出 ...
- Java for LeetCode 102 Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- Java for LeetCode 080 Remove Duplicates from Sorted Array II
Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For examp ...
- 前端JSONPJIE解决跨域问题
解决同源策略的两个方法 1 . JSONP jsonp (将 JSON 数据填充进回调函数,这就是JSONP的JSON+Padding 的含义) jsonp是json用来跨域的一个东西,原理是通过sc ...
- python之virtualenv 与 virtualenvwrapper 详解
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- css 样式(checkbox开关、css按钮)
checkbox开关 css .iosCheck { /* Blue edition */ } .iosCheck input { display: none; } .iosCheck i { dis ...