浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1798

线段树区间加区间乘区间询问裸题。因为乘标记会影响加标记,所以优先下传乘标记。

时间复杂度:\(O(mlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
using namespace std; const int maxn=1e5+5; int n,m,pps;
int a[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct segment_tree {
int tree[maxn<<2],add_tag[maxn<<2],mul_tag[maxn<<2]; void updata(int p) {
tree[p]=(tree[p<<1]+tree[p<<1|1])%pps;
} void build(int p,int l,int r) {
if(l==r) {
tree[p]=a[l];
return;
}mul_tag[p]=1,add_tag[p]=0;//乘1加0等于本身
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
updata(p);
} void add_add_tag(int p,int l,int r,int v) {
tree[p]=(tree[p]+1ll*(r-l+1)*v%pps)%pps;
add_tag[p]=(add_tag[p]+v)%pps;
} void add_mul_tag(int p,int l,int r,int v) {
tree[p]=1ll*tree[p]*v%pps;
add_tag[p]=1ll*add_tag[p]*v%pps;
mul_tag[p]=1ll*mul_tag[p]*v%pps;
} void push_down(int p,int l,int r) {
int mid=(l+r)>>1;
if(mul_tag[p]!=1) {
add_mul_tag(p<<1,l,mid,mul_tag[p]);
add_mul_tag(p<<1|1,mid+1,r,mul_tag[p]);
mul_tag[p]=1;
}
if(add_tag[p]) {
add_add_tag(p<<1,l,mid,add_tag[p]);
add_add_tag(p<<1|1,mid+1,r,add_tag[p]);
add_tag[p]=0;
}
} void change_mul(int p,int l,int r,int L,int R,int v) {
if(L<=l&&r<=R) {
add_mul_tag(p,l,r,v);
return;
}
int mid=(l+r)>>1;push_down(p,l,r);
if(L<=mid)change_mul(p<<1,l,mid,L,R,v);
if(R>mid)change_mul(p<<1|1,mid+1,r,L,R,v);
updata(p);
} void change_add(int p,int l,int r,int L,int R,int v) {
if(L<=l&&r<=R) {
add_add_tag(p,l,r,v);
return;
}
int mid=(l+r)>>1;push_down(p,l,r);
if(L<=mid)change_add(p<<1,l,mid,L,R,v);
if(R>mid)change_add(p<<1|1,mid+1,r,L,R,v);
updata(p);
} int query(int p,int l,int r,int L,int R) {
if(L<=l&&r<=R)return tree[p];
int mid=(l+r)>>1,res=0;push_down(p,l,r);
if(L<=mid)res=query(p<<1,l,mid,L,R);
if(R>mid)res=(res+query(p<<1|1,mid+1,r,L,R))%pps;
return res;
}
}T; int main() {
n=read(),pps=read();
for(int i=1;i<=n;i++)
a[i]=read()%pps;
T.build(1,1,n);m=read();
for(int i=1;i<=m;i++) {
int opt=read(),l=read(),r=read(),v;
if(opt!=3)v=read();
if(opt==1)T.change_mul(1,1,n,l,r,v);
else if(opt==2)T.change_add(1,1,n,l,r,v);
else printf("%d\n",T.query(1,1,n,l,r));
}
return 0;
}

BZOJ1798:[AHOI2009]维护序列的更多相关文章

  1. bzoj1798 [Ahoi2009]维护序列

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

  2. 【线段树】Bzoj1798 [AHOI2009] 维护序列

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

  3. BZOJ1798[Ahoi2009]维护序列——线段树

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

  4. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  5. [Luogu 2023] AHOI2009 维护序列

    [Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...

  6. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  7. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  8. 洛谷 P2023 [AHOI2009]维护序列

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

  9. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  10. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

随机推荐

  1. &lt;LeetCode OJ&gt; 141 / 142 Linked List Cycle(I / II)

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  2. JVM学习02-GC算法与种类

    1. GC 简单介绍 GC(Garbage Collection) 是垃圾收集的简写,GC机制是java中一个比較重要的概念.java的内存管理提供了内存的分配和释放.内存处理是程序编写人员非常eas ...

  3. Mysql 的存储引擎,myisam和innodb的区别。

    简单的表达. MyISAM 是非事务的存储引擎. innodb是支持事务的存储引擎. innodb的引擎比较适合于插入和更新操作比较多的应用 而MyISAM 则适合用于频繁查询的应用 MyISAM - ...

  4. HTTP POST请求数据提交格式(转)

    FROM: http://bbs.125.la/thread-13743350-1-1.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT ...

  5. Python学习总结之二 -- 数据类型

    带你走进数据类型 一:整数.浮点数 Python中整数和浮点数的定义以及运算和C++都是一样的,我在这里就不需多说了,我就说明一点:Python相对于C/C++而言,定义整数没有int 和 long ...

  6. 常用sql集锦

    1.从数据库A中把表tableA导入到数据库B中 --如果主键是自增,则必须列出具体字段.-- select * into tableA from A..tableA 2.批量更改表中某列中的某个字符 ...

  7. 九度OJ 1160:放苹果 (DFS)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:998 解决:680 题目描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和 ...

  8. 九度OJ 1158:买房子 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1801 解决:1096 题目描述: 某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每 ...

  9. 中文WebFont探索

    本文主要讲中文webFont的相关知识,包含了业界现状.WebFont优势.实现方案等. 一 业界使用WebFont现状 1.1 英文WebFont使用现状 英文版已使用非常广泛.比较有名的字体库:G ...

  10. Django创建模型_模型层

    1.在项目Mysite下创建应用bms 2.在bms下的models.py文件中创建模型 from django.db import models # Create your models here. ...