【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)
【题意】给定序列,支持区间加和区间乘,查询区间和取模。n<=10^5。
【算法】线段树
【题解】线段树多重标记要考虑标记与标记之间的相互影响。
对于sum*b+a,+c直接加上即可。
*c后就是(sum*b+a)*c=sum*b*b+a*c,也就是加法的部分也要乘。
所以,每次在乘法的时候要把加法标记也乘上。下传时先传乘法。
注意乘法初始值为1,但是取模后可能为0。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
int read(){
int s=,t=;char c;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
struct tree{int l,r,a,b,sum;}t[maxn*];
int n,MOD,a[maxn];
int M(int x){return x>=MOD?x-MOD:x;}
void up(int k){t[k].sum=M(t[k<<].sum+t[k<<|].sum);}
void modify_a(int k,int x){t[k].sum=M(t[k].sum+1ll*(t[k].r-t[k].l+)*x%MOD);t[k].a=M(t[k].a+x);}//
void modify_b(int k,int x){t[k].sum=1ll*t[k].sum*x%MOD;t[k].b=1ll*t[k].b*x%MOD;t[k].a=1ll*t[k].a*x%MOD;}
void down(int k){
if(t[k].b!=){//
modify_b(k<<,t[k].b);modify_b(k<<|,t[k].b);
t[k].b=;
}
if(t[k].a){
modify_a(k<<,t[k].a);modify_a(k<<|,t[k].a);
t[k].a=;
}
}
void build(int k,int l,int r){
t[k].l=l;t[k].r=r;t[k].a=;t[k].b=;
if(l==r){t[k].sum=a[l];return;}
int mid=(l+r)>>;
build(k<<,l,mid);build(k<<|,mid+,r);
up(k);
}
void add(int k,int l,int r,int x){
if(l<=t[k].l&&t[k].r<=r){modify_a(k,x);return;}
down(k);
int mid=(t[k].l+t[k].r)>>;//
if(l<=mid)add(k<<,l,r,x);
if(r>mid)add(k<<|,l,r,x);
up(k);
}
void mul(int k,int l,int r,int x){
if(l<=t[k].l&&t[k].r<=r){modify_b(k,x);return;}
down(k);
int mid=(t[k].l+t[k].r)>>;//
if(l<=mid)mul(k<<,l,r,x);
if(r>mid)mul(k<<|,l,r,x);
up(k);
}
int query(int k,int l,int r){
if(l<=t[k].l&&t[k].r<=r){return t[k].sum;}
down(k);
int mid=(t[k].l+t[k].r)>>,sum=;
if(l<=mid)sum=query(k<<,l,r);
if(r>mid)sum=M(sum+query(k<<|,l,r));
return sum;
}
int main(){
n=read();MOD=read();
for(int i=;i<=n;i++)a[i]=read()%MOD;
build(,,n);
int m=read();
while(m--){
int k=read(),x=read(),y=read();
if(k==){printf("%d\n",query(,x,y));continue;}
int z=read();
if(k==)mul(,x,y,z%MOD);else add(,x,y,z%MOD);
}
return ;
}
【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)的更多相关文章
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...
随机推荐
- PAT 甲级 1132 Cut Integer
https://pintia.cn/problem-sets/994805342720868352/problems/994805347145859072 Cutting an integer mea ...
- mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符
mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符
- HostsConfig文件修改器
Hosts文件修改器 HostsConfig v1.1 免费版 最近工作需要,经常需要更换各种域名的内外网配置,频繁的修改HOSTS文件,很多的时间都用在的修改HOSTS文件上,工作效率大大降低,课余 ...
- Spring 学习7 -事务
1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...
- CentOS 7 开放3306端口访问
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙.1.关闭firewall:systemctl stop firewalld.servicesystemctl ...
- RAD Studio 10.3 Rio (BCB & Dephi) 发布啦
期盼已久的RAD Studio 10.3 Rio 终于发布了: 下载链接:http://altd.embarcadero.com/download/radstudio/10.3/delphicbui ...
- 某客的《微信小程序》从基础到实战视频教程
第 1 部分 微信小程序从基础到实战课程概要 第 1 节 微信小程序从基础到实战课程概要 1.1微信小程序从基础到实战课程概要 第 2 部分 初识微信小程序 第 1 节 微信小程序简 ...
- Android四大组件之Intent
Intent不是android几大组件框架,但是确实是android 各大组件之间沟通的桥梁. 尤其Intent对于activity有很大的关系. 一下是我个人对task以及backstack的总结.
- [十三]SpringBoot 之 过滤器(Filter)和监听器(Listener)
过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet 一样,不清楚的可以查看下上一篇文章 代码示例 package me.shijunjie.filter; import ...
- 51nod 1292 字符串中的最大值V2(后缀自动机)
题意: 有一个字符串T.字符串S的F函数值可以如下计算:F(S) = L * S在T中出现的次数(L为字符串S的长度).求所有T的子串S中,函数F(S)的最大值. 题解: 求T的后缀自动机,然后所有每 ...