先上一波题目 https://www.luogu.org/problem/P2023

复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和

tips:线段树在传标记的时候 优先传乘法标记再传加法标记 规定好顺序就不会错了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=;
LL read(){
LL ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,L,R;
LL C,mod;
struct node{
int l,r;
LL ad,mx,sum;
}e[M*];
void up(int x){e[x].sum=(e[x<<].sum+e[x<<^].sum)%mod;}
void build(int x,int l,int r){
e[x].l=l; e[x].r=r;
e[x].ad=; e[x].mx=;
if(l==r){e[x].sum=read()%mod; return ;}
int mid=(l+r)>>;
build(x<<,l,mid);
build(x<<^,mid+,r);
up(x);
}
void down(int x){
LL ad=e[x].ad,mx=e[x].mx;
LL ls=x<<,rs=x<<^,len1=e[ls].r-e[ls].l+,len2=e[rs].r-e[rs].l+;
if(mx!=){
e[ls].sum=e[ls].sum*mx%mod;
e[ls].ad=e[ls].ad*mx%mod;
e[ls].mx=e[ls].mx*mx%mod;
e[rs].sum=e[rs].sum*mx%mod;
e[rs].ad=e[rs].ad*mx%mod;
e[rs].mx=e[rs].mx*mx%mod;
e[x].mx=;
}
if(ad){
e[ls].sum=(e[ls].sum+ad*len1%mod)%mod;
e[ls].ad=(e[ls].ad+ad)%mod;
e[rs].sum=(e[rs].sum+ad*len2%mod)%mod;
e[rs].ad=(e[rs].ad+ad)%mod;
e[x].ad=;
}
}
void dmx(int x){
if(L<=e[x].l&&e[x].r<=R){
e[x].sum=e[x].sum*C%mod;
e[x].ad=e[x].ad*C%mod;
e[x].mx=e[x].mx*C%mod;
return ;
}
down(x);
int mid=(e[x].l+e[x].r)>>;
if(L<=mid) dmx(x<<);
if(R>mid) dmx(x<<^);
up(x);
}
void dadd(int x){
if(L<=e[x].l&&e[x].r<=R){
LL len=e[x].r-e[x].l+;
e[x].sum=(e[x].sum+C*len%mod)%mod;
e[x].ad=(e[x].ad+C)%mod;
return ;
}
down(x);
int mid=(e[x].l+e[x].r)>>;
if(L<=mid) dadd(x<<);
if(R>mid) dadd(x<<^);
up(x);
}
LL push(int x){
if(L<=e[x].l&&e[x].r<=R) return e[x].sum;
down(x);
int mid=(e[x].l+e[x].r)>>;
LL ans=;
if(L<=mid) ans=(ans+push(x<<))%mod;
if(R>mid) ans=(ans+push(x<<^))%mod;
up(x);
return ans;
}
int k,m;
int main(){
n=read(); mod=read();
build(,,n);
m=read();
for(int i=;i<=m;i++){
k=read(); L=read(); R=read();
if(k==) C=read()%mod,dmx();
else if(k==) C=read()%mod,dadd();
else printf("%lld\n",push());
}
return ;
}

洛谷 P2023 维护序列——线段树的更多相关文章

  1. 洛谷 P2023 维护序列 题解

    题面 注意一个细节,查询和更新都需要pushdown(); #include <bits/stdc++.h> #define int long long using namespace s ...

  2. [P2023][AHOI2009]维护序列(线段树)

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  3. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  4. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  5. BZOJ 1500 洛谷2042维护序列题解

    BZ链接 洛谷链接 这道题真是丧心病狂.... 应该很容易就可以看出做法,但是写代码写的....... 思路很简单,用一个平衡树维护一下所有的操作就好了,重点讲解一下代码的细节 首先如果按照常规写法的 ...

  6. BZOJ 1798 AHOI2009 Seq 维护序列 线段树

    题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...

  7. 【洛谷P2894】Hotel 线段树+二分查询

    题目大意:给定一个长度为 N 的序列,每个点有两种状态 1/0,表示占有和空闲,现支持 first-fit 查询是否有一段连续的长度为 X 的空闲子序列和区间赋值操作. 题解:get到了线段树新技能. ...

  8. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  9. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

随机推荐

  1. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  2. 斯坦福【概率与统计】课程笔记(六):EDA | 标准差和方差

    这一篇比较简单,就不展开记录了,方差和标准差的计算方法记住了就可以. 计算mean 计算每个样本与mean的差值的平方,将其累加后除以(样本数-1)[注:这里的除数可以是n-1也可以是n],即得到方差 ...

  3. Selenium:WebDriverApi接口详解

    浏览器操作 # 刷新 driver.refresh() # 前进 driver.forward() # 后退 driver.back() Cookie操作 # 根据cookieKey,获取cookie ...

  4. JMeter的那些问题

    我们从以下几个点来看jmeter: 1.jmeter是什么? 2.jmeter为什么我们要使用jmeter?他可以帮我们解决那些事情? 3.怎样使用jmeter做这些事情? 4.我们在什么时候会使用j ...

  5. JavaScript-打开新窗口(window.open)和 关闭窗口(window.close)

    JavaScript-打开新窗口 open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 参数说明: URL:可选 ...

  6. C++中采用操作符重载完善复数类

    1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...

  7. python基础之运算符和编码

    while循环 什么是循环? 就是不断的重复做一件事 while --关键字 后边跟条件 :还有循环体. 条件体为真,循环体内执行,为假不执行 while else 两者为一体的,相当于 if els ...

  8. SCAU大二上Java综合性实验

    一.题目要求 实验内容: 1. 已经提供的原始数据:班级成绩单文件 该文件为文本文件,存储某个班的所有学生某门课程的成绩. 例如:2012级计算机科学与技术8班-面向对象程序设计.txt 文件中每行存 ...

  9. Model-View-ViewModel (MVVM) Explained 转摘自:http://www.wintellect.com/blogs/jlikness/model-view-viewmodel-mvvm-explained

    The purpose of this post is to provide an introduction to the Model-View-ViewModel (MVVM) pattern. W ...

  10. ubuntu16.04安装docker11.09

    1.    安装Docker 操作系统 ubuntu16.04 1.1.   配置源文件 $sudo apt-get update #允许 apt 命令 HTTPS 访问 Docker 源 $sudo ...