BZOJ1798:[AHOI2009]维护序列
浅谈树状数组与线段树: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]维护序列的更多相关文章
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- 【线段树】Bzoj1798 [AHOI2009] 维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- BZOJ1798[Ahoi2009]维护序列——线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [Luogu 2023] AHOI2009 维护序列
[Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷 P2023 [AHOI2009]维护序列
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
随机推荐
- PHP通过prepare执行查询取得数据
可以用来防止sql注入 <?php $pdo=new PDO("mysql:host=localhost;dbname=itest", 'root',''); //先构建查询 ...
- 如何创建RESTFul Web服务
想写这篇文章很久了,这是个大话题,不是一时半会就能说清楚的. 所以准备花个一星期整理资料,把思路理清楚,然后再在Team里做个sharing:) 其实RESTFul是架构风格,并不是实现规范,也不一定 ...
- Node.js下载及安装
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用. Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适 ...
- 利用xlrd模块实现Python读取Excel文档
# -*- coding: cp936 -*- #python读取excel import xlrd def main(): xls=xlrd.open_workbook("d:\\11.x ...
- (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试
Android单元和instrumentation单元測试 Developing Android unit and instrumentation tests Android的单元測试是基于JUnit ...
- ASP.NET机制详细的管道事件流程(转)
ASP.NET机制详细的管道事件流程 第一:浏览器向服务器发送请求. 1)浏览器向iis服务器发送请求网址的域名,根据http协议封装成请求报文,通过dns解析请求的ip地址,接着通过socket与i ...
- 【puppeteer+Node.js安装环境】之WebStorm编辑器运行失败问题:Error: Cannot find module 'puppeteer'并且代码出不来“asnyc”标识以及有红色波浪线解决办法
现象一: module.js:557 throw err; ^ Error: Cannot find module 'puppeteer' at Function.Module._r ...
- redis错误error记录
早上登服务器,看到程序的redis的报错, 具体如下: (error) MISCONF Redis is configured to save RDB snapshots, but is curren ...
- 如何将linux服务器作为文件服务器
在开发过程中想要使用linux服务器作为文件服务器,可以通过 IP+文件名来获取文件信息,比如http://localhost/banner/a.jpg.设置过程如下 1.安装apache2 sudo ...
- android菜鸟学习笔记1----环境搭建
Step1 JDK安装及配置: 1.下载并安装JDK: 根据自己系统情况,选择安装相应的JDK版本 当前系统:64位WIN8,内存8G 选择了Java SE 8u45 即JDK 1.8.0_45,可以 ...