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 字符串内容是数组格式 转换成数组
一个简单的应用.. 例, $str = "array( 'USD'=>'1', 'GBP'=>'0.6494', 'EUR'=>'0.7668' ,'JPY'= ...
- JS加水印遮罩
<%@ page language="java" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC & ...
- Layout布局位置
- - GUILayout 这个本身就是用于自动布局的. 不用给定位置的,这也是它与GUI的区别所在.通常默认开始的位置是屏幕的左上角. 当然你也可以限定开始自动布局的位置.用 GUILayout.B ...
- NERO8.0刻录系统光盘
正常启动NREO,点击NERO 8.0左下角图标(启动NERO应用程序和工具),选NERO Express Essentials,在左边的几个选项中选择“映像.项目.复制”,右边选“光盘映像或保存的项 ...
- Mac 下 Git 的基础命令行操作
Mac 下 Git 的基础命令行操作 sudo apt-get install git-core //安装Git 用户配置 git config --global user.name "Yo ...
- 宇视摄像机RTSP地址格式规则
rtsp://{用户名}:{密码}@{ip}:{port}/video1/2/3,分别对应主/辅/三码流: 比如: rtsp://admin:admin@192.168.8.8:554/video1, ...
- 微信小程序设计指南
微信小程序设计指南 · 小程序 https://developers.weixin.qq.com/miniprogram/design/index.html
- SQL2005数据库放在C盘,结果C盘满了,怎么搞到D盘
首先,你需要将自己所建立的数据库从SQL2005中分离出来,然后按照自己的存储路径找到自己所建数据库存储的位置,把它剪切到D盘就可以了.(mdf,ldf都应该考过去,自己建立路径存储就可以,再次打开的 ...
- shell执行lua脚本传参数
#lua test.lua 2 5arg[0]= test.lua arg[1]= 2arg[2]= 5 if arg[1] and arg[1] == "2" then prin ...
- Java for LeetCode 113 Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...